<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>round.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 14 Nov 2024 12:56:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. round.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/round_pic" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[UI Component] 01. APP BAR]]></title>
            <link>https://velog.io/@round_pic/UI-Component-01.-APP-BAR</link>
            <guid>https://velog.io/@round_pic/UI-Component-01.-APP-BAR</guid>
            <pubDate>Thu, 14 Nov 2024 12:56:55 GMT</pubDate>
            <description><![CDATA[<h2 id="app-bar">APP BAR</h2>
<p>APP BAR는 서비스에서 주로 내비게이션 역할을 하고 있다.
로고가 담길 수도 있고, 햄버거 버튼(메뉴 버튼)을 두기도 하고, 주요한 기능을 주로 둔다.</p>
<blockquote>
<p>⬇️ APP BAR 서비스 예시
<img src="https://velog.velcdn.com/images/round_pic/post/5ab5648f-a797-49e9-aa77-7dea4ac51a15/image.png" alt=""></p>
</blockquote>
<ol>
<li><p>중앙 정렬 타입
타이틀 혹은 로고 타입을 중앙 정렬로 사용하는 경우, 두 개 이상의 아이콘을 사용하지 않는다.</p>
</li>
<li><p>좌측 정렬 타입
타이틀을 좌측 정렬로 사용 시 액션 아이콘은 네 개 이상 사용하지 않는다.</p>
</li>
</ol>
<h3 id="컴포넌트-내부요소">컴포넌트 내부요소</h3>
<p><img src="https://velog.velcdn.com/images/round_pic/post/62eef494-e73f-47b3-88c2-882d620abe14/image.png" alt=""></p>
<ol>
<li>Container</li>
<li>Navigation icon (Optional)</li>
<li>Title (Optional)</li>
<li>Action icons (Optional)</li>
</ol>
<h3 id="app-bar-style">APP BAR STYLE</h3>
<ol>
<li><p>Standard app bar
<img src="https://velog.velcdn.com/images/round_pic/post/81ac6244-6289-4eec-8f8d-8747c790d78c/image.png" alt=""></p>
</li>
<li><p>Extended app bar
<img src="https://velog.velcdn.com/images/round_pic/post/3cb35fc1-061a-4020-99ce-bb3a52c29def/image.png" alt=""></p>
</li>
<li><p>Contextual action bar
ex) 여러 이미지 or 연락처 목록 한번에 삭제 편집하는 경우</p>
</li>
</ol>
<h3 id="app-bar-그리기-실습">APP BAR 그리기 실습</h3>
<p><img src="https://velog.velcdn.com/images/round_pic/post/e97831b7-89bc-438e-a5d1-da7578d52ecd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] 네이버지도 API 사용하기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-%EB%84%A4%EC%9D%B4%EB%B2%84%EC%A7%80%EB%8F%84-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-%EB%84%A4%EC%9D%B4%EB%B2%84%EC%A7%80%EB%8F%84-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 19 Oct 2022 08:44:43 GMT</pubDate>
            <description><![CDATA[<h3 id="네이버-클라우드에서-설정하기">네이버 클라우드에서 설정하기</h3>
<p><a href="https://www.ncloud.com/">NAVER Cloud</a> 홈페이지에서 API 클라이언트 ID를 발급받을 수 있다.</p>
<ol>
<li><p>콘솔 탭으로 들어간 다음
<img src="https://velog.velcdn.com/images/round_pic/post/b535eca3-8c71-486c-a1b8-78bf926b557c/image.png" alt=""></p>
</li>
<li><p>AI, NAVER API를 누른 뒤 사용하고 싶은 API를 선택하면 된다.
<img src="https://velog.velcdn.com/images/round_pic/post/b4ff60ea-fb7e-4e14-ad13-00c26a369572/image.png" alt=""></p>
</li>
<li><p>App 이름을 설정하고, Mobile Dynamic Map을 선택하면 아래와 같이 나타난다.
<img src="https://velog.velcdn.com/images/round_pic/post/dfe15a9c-6022-483a-811c-e9c03212fa17/image.png" alt=""></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/round_pic/post/5016c6c4-b829-45c7-8948-69b1f6e5050b/image.png" alt=""></p>
<ol start="4">
<li>Xcode 프로젝트의 &#39;Bundle Identifier&#39;를 iOS Bundle ID에 추가하고 등록하면 완료!
<img src="https://velog.velcdn.com/images/round_pic/post/184b5e2e-358c-4b10-b1d4-eb5faebfb387/image.png" alt=""></li>
</ol>
<h3 id="라이브러리-설치">라이브러리 설치</h3>
<p>공식 가이드도 참고하고, 구글링을 통해 여러 시도 끝에 성공했다.</p>
<ol>
<li>cocoapod 설치<pre><code>sudo gem install cocoapods</code></pre></li>
</ol>
<ul>
<li>오류날 때 아래 코드 입력<pre><code>brew install cocoapods --build-from-source</code></pre></li>
</ul>
<ol start="2">
<li><p>homebrew 설치</p>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quot;</code></pre></li>
<li><p>git-lfs 설치</p>
<pre><code>brew install git-lfs</code></pre></li>
</ol>
<h3 id="프로젝트-경로에서-진행하기">프로젝트 경로에서 진행하기</h3>
<ol>
<li><p>cocoapod 초기화</p>
<pre><code>pod init</code></pre></li>
<li><p>git-lfs 초기화</p>
<pre><code>git-lfs install</code></pre></li>
<li><p>Podfile을 열고 아래 코드를 추가해준다.</p>
<pre><code>pod &#39;NMapsMap&#39;</code></pre><p><img src="https://velog.velcdn.com/images/round_pic/post/5bfe781f-791a-44a9-a388-5f0bc9fd65df/image.png" alt=""></p>
</li>
<li><p>pod install 로 라이브러리를 설치</p>
<pre><code>pod install --repo-update</code></pre></li>
</ol>
<h3 id="xcode에서-클라이언트id-지정">Xcode에서 클라이언트ID 지정</h3>
<p>Info.plist 파일에서
Key: NMFClientId 
Value: Client ID</p>
<p>발급받은 Client ID는 App 인증정보를 누르면 볼 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/83f5bac7-3a5c-4aa8-9e54-653108c362e6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/5d71ac16-46e4-4340-896d-a541f3273199/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/5a9122f6-be65-4f3f-b71b-58eb6c26b962/image.png" alt=""></p>
<h3 id="지도화면-나타내기">지도화면 나타내기</h3>
<p>viewController에서 아래코드를 입력하여 실행하면 지도화면이 나타난다.
<img src="https://velog.velcdn.com/images/round_pic/post/0fb16f38-5deb-4239-b6bc-7231b4485215/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/e3ba3652-355b-4065-a383-ba2b2e918bf0/image.png" alt=""></p>
<blockquote>
<p>다음에 할 것</p>
</blockquote>
<ul>
<li>지도 좌표 설정</li>
<li>마커 띄우기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] Table View에서 화면 이동 + 네비게이션 바 추가하기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-Table-View%EC%97%90%EC%84%9C-%ED%99%94%EB%A9%B4-%EC%9D%B4%EB%8F%99-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EB%B0%94-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-Table-View%EC%97%90%EC%84%9C-%ED%99%94%EB%A9%B4-%EC%9D%B4%EB%8F%99-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EB%B0%94-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 04 Oct 2022 12:07:09 GMT</pubDate>
            <description><![CDATA[<p>저번 포스팅에 이어서 디테일 화면 구현과 네비게이션바를 추가해보자!</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/dd5a1b28-4f04-4cc7-81ff-92242181f892/image.png" alt=""></p>
<p>화면 이동을 하기 위해서는 View Controller를 추가해주고 Control을 하여 Present Modaily를 선택한다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/f84dbd50-6182-4f8b-90cc-9b22bc9b4cb3/image.png" alt=""></p>
<p>Cell을 클릭했을 때 다음 화면으로 이동하게 만들 것이다.</p>
<p>먼저, 다음 화면 UI를 꾸며준다.
<img src="https://velog.velcdn.com/images/round_pic/post/1b042e4e-7663-4702-b1ff-3435eada7af2/image.png" alt=""></p>
<p>ImageView와 Label을 추가하여 Stack View로 묶어준다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/1ed1b64a-eb10-4ce5-b869-c3bc185bf0c8/image.png" alt="">
ImageView와 Label 높이를 설정하고, Stack View로 묶어 위 간격과, Alignment를 Fill로 설정하고, Label 글자크기 설정, X축의 가운데를 설정하면 위치가 조정된다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/83fa5f8d-a9a1-4001-b162-b98f666304c5/image.png" alt="">
View Controller를 코드와 연결하기 위해 Controllers파일에 새로운 파일을 만들어준다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/92bf61a6-58af-48eb-b9f4-7016d97c2256/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/2e91aea1-cfc0-4982-b5b3-b8fdbe04304d/image.png" alt=""></p>
<p>Assistent를 통해 코드와 연결한다.
<img src="https://velog.velcdn.com/images/round_pic/post/b9b37e16-2dfc-472c-94e1-71041311c143/image.png" alt=""></p>
<p>하나의 View Controller파일에 연결하기 위해 Control 버튼을 누르고, ImageView와 Label을 연결한다.
<img src="https://velog.velcdn.com/images/round_pic/post/ad72be99-701e-4d17-91f7-ca9c31d3b3f1/image.png" alt=""></p>
<p>ViewDidLoad에서 데이터를 받아오면 데이터를 표시해주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/f78eed21-aff9-419d-b811-43c49d1f95a8/image.png" alt=""></p>
<p>setupUI 함수를 만들어 데이터들을 화면에 표시할 수 있게 코드를 설정해준다.</p>
<p>테이블뷰에서 어떤 특정한 셀이 터치가 되면 이 메서드를 실행시키는 것이다.
didSelectRowAt : 유저가 n번째 셀을 선택하면 이 메서드를 호출하게 된다.</p>
<pre><code>func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        &lt;#code#&gt;
    }</code></pre><p>Storyboard에서 세그웨이를 만들었을 때 performSegue를 실행시키면 다음 화면으로 넘어간다.</p>
<pre><code>performSegue(withIdentifier: &quot;toDetail&quot;, sender: indexPath)</code></pre><p>performSegue를 할 때 &quot;toDetail&quot;이라는 문자열을 가진 세그웨이를 실행시킨다.
<img src="https://velog.velcdn.com/images/round_pic/post/40564287-21da-4e81-af1f-3cea68533702/image.png" alt=""></p>
<p>세그웨이를 통해 다음 화면으로 가는 메서드를 실행하는 것이다.</p>
<pre><code>performSegue(withIdentifier: &quot;toDetail&quot;, sender: indexPath)</code></pre><p>다음화면으로 데이터를 전달하려면?
prepare 세그웨이를 실행시키면 된다.</p>
<pre><code>override func prepare(for: segue: UIStoryboardSegue, sender: Any?) {

    }</code></pre><p>identifier가 &quot;toDetail&quot;이라면 데이터를 전달하고,
타입캐스팅을 통해 UIViewController타입인 구체적인 타입으로 타입캐스팅한 다음 deatilVC 상수에 foodData를 전달하는 것이다.
<img src="https://velog.velcdn.com/images/round_pic/post/6da69afd-abe2-42d1-8d7e-74036c5a7da6/image.png" alt=""></p>
<p>배열에서 데이터를 전달하기 때문에 foodDataManager.getFoodData()에서 배열을 받아오고,
배열에서 몇번째인지 꺼내기 위해 IndexPath 파라미터를 전달해줘야 한다.
sender 타입을 Indexpath로 타입캐스팅해야 한다.</p>
<p>tableView에 접근해서 delegate 속성에 self를 꼭 설정해야 한다!</p>
<pre><code>tableView.delegate = self</code></pre><p>tableView에 View Controller인 내가 대리자가 될 것이다 라는 뜻!</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/5f8ce8a5-da87-4db4-a5ec-ea0021090a8b/image.png" alt=""></p>
<p>Storyboard에서 Selection - Single Selection이라 설정하면 다음화면으로 넘어가게 된다.
<img src="https://velog.velcdn.com/images/round_pic/post/b214740d-eae3-40ca-9d64-dfc5650171e1/image.png" alt=""></p>
<p>다음 화면으로 잘 넘어가는 것을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/8f73b0d2-b22b-4a7c-8ce7-d9a175538a2b/image.png" alt=""></p>
<p>이제, 네비게이션바를 만들어보자.
Storyboard에서 View Controller를 선택하고, Navigation Controller를 선택한다.
<img src="https://velog.velcdn.com/images/round_pic/post/992ef488-a4d8-4335-a696-2be896da1694/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/adbb3885-c793-4a1b-aaa0-0ad40dd1fc19/image.png" alt=""></p>
<p>세그웨이를 누르고, Kind - Show(push)를 선택하면 전체화면으로 변경되고, 전화면으로 돌아갈 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/beb85ac1-1b14-40c9-b370-cb9c8732cdeb/image.png" alt=""></p>
<p>Bar Button Item을 선택하면 상단에 버튼이 생긴 것을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/ecd7dda9-eb9a-43ea-9241-5ec2151032b9/image.png" alt="">
<img src="https://velog.velcdn.com/images/round_pic/post/af11dc6b-b99f-4989-95dd-d0b30d50c19b/image.png" alt=""></p>
<p>System Item에서 Add를 선택하면 &quot;+&quot;버튼으로 설정할 수 있다.</p>
<p>&quot;+&quot;를 눌렀을 때 Item을 추가할 수 있는 코드를 설정해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/2ed27c70-fac2-4911-99f6-459cb850ad84/image.png" alt=""></p>
<p>음식데이터들을 담고있는 배열에 하나의 데이터를 담는 구조체를 만들어준다.
함수의 이름은 updateFoodData로 설정하였다.
<img src="https://velog.velcdn.com/images/round_pic/post/e6dd9c0f-2168-4e45-8377-79a7a8db216b/image.png" alt=""></p>
<p>updateFoodData를 호출하면 하나의 음식데이터가 더 추가된다.
reloadData() 메서드를 사용하여 데이터가 늘어난만큼 다시 테이블에 표시하게끔 한다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/f4456bad-8af3-4825-9a1a-0b4660b1bc15/image.png" alt=""></p>
<p>앱을 실행하여 &quot;+&quot;버튼을 누르면 데이터들이 추가되는 것을 확인할 수 있다.
데이터가 하나밖에 없기 때문에 데이터가 하나만 추가되고 있다.</p>
<p>또한, 네비게이션바에 title을 설정하고 싶으면 
UITableView내부에 title = &quot;텍스트&quot;을 설정하면 네비게이션바에 title이 나타나게 된다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/1a1a72a6-b2e7-43d5-8f4f-fee2d8880b80/image.png" alt=""></p>
<blockquote>
<p>다음에 할 것
여러 데이터 추가하고, 데이터를 수정하는 방법 구현하기</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] Table View 적용하기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-Table-View-%ED%99%94%EB%A9%B4%EC%9D%B4%EB%8F%99-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-Table-View-%ED%99%94%EB%A9%B4%EC%9D%B4%EB%8F%99-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 28 Sep 2022 08:20:18 GMT</pubDate>
            <description><![CDATA[<p>테이블뷰는 &quot;세로형식&quot;으로 나눠진 뷰들의 묶음이다.
테이블뷰의 기본 형태는 세로로만 스크롤이 가능하다.</p>
<p>먼저 storyboard에서 Table View를 추가한다.
<img src="https://velog.velcdn.com/images/round_pic/post/3d66bd6d-0aa3-4f58-be09-963b3388fcd7/image.png" alt=""></p>
<p>margin을 체크해제하고, 0으로 설정하여 오토레이아웃을 잡아준다.
<img src="https://velog.velcdn.com/images/round_pic/post/36d52e53-1e8f-428f-85f7-f6e583a487bd/image.png" alt=""></p>
<p>하단까지 조정하고 싶으면 Size inspector에 들어가서 Bottom을 클릭한다.
<img src="https://velog.velcdn.com/images/round_pic/post/d9483927-4191-404a-8ac2-a892cbca8498/image.png" alt=""></p>
<p>Safe Area가 아닌 Superview로 설정하면 아래끝까지 Table View가 내려가고, Constant를 0으로 설정하면 완전히 내려간다.
<img src="https://velog.velcdn.com/images/round_pic/post/e70e63b9-db79-4792-8977-e689836ee3a1/image.png" alt=""></p>
<p>Table View에서 control을 끌어 테이블뷰의 속성을 만든다.
<img src="https://velog.velcdn.com/images/round_pic/post/c0e9ce09-b7df-4915-8c07-e02994abc4d9/image.png" alt="">
<img src="https://velog.velcdn.com/images/round_pic/post/aa9c201f-4418-4696-9c9a-f1d8000624f2/image.png" alt=""></p>
<p>Table View를 사용할 때는 프로토콜을 채택해야 하는데 UITableViewDataSource 프로토콜을 채택한다.
Table View와 View Controller 간 통신을 할 수 있는 프로토콜이다.</p>
<pre><code>class ViewController: UIViewController, UITableViewDataSource {</code></pre><p>테이블뷰를 만들면 이 함수를 반드시 실행시켜야 한다.</p>
<ol>
<li>몇개의 컨텐츠를 만들면 되는지
ex ] return 5 라고 하면 컨텐츠 5개 생성</li>
<li>테이블뷰의 cellForRowAt 몇번째 셀은 어떻게 표시를 하면 되는지
ex ] return UITableViewCell()<pre><code>func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
     &lt;#code#&gt;
 }
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
     &lt;#code#&gt;
 }</code></pre></li>
</ol>
<p>Tabel View 위에 Tabel View Cell을 올린다.
<img src="https://velog.velcdn.com/images/round_pic/post/0dbcf179-1aec-4d6b-9312-5645538ff6c4/image.png" alt=""></p>
<p>하나의 프로토타입이 될 수 있는 Prototype Cell이다.
<img src="https://velog.velcdn.com/images/round_pic/post/3b5457ba-a25a-495f-a5f9-aa34bee794b9/image.png" alt=""></p>
<p>Cell위에 UIImageView를 올린다.
<img src="https://velog.velcdn.com/images/round_pic/post/e07bbdf8-91e3-4aa1-9f91-828cc7c21b09/image.png" alt=""></p>
<p>UIImageView 높이와 넓이, 간격을 설정하고, Label을 추가해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/42aff63f-9b5a-4e13-b371-f97f32287900/image.png" alt=""></p>
<p>Label을 Stack View로 묶어 위 Label에 높이를 설정하고, 
UIImageView의 높이와 맞추기 위해 First Item에서 Image View.Bottom과 Image.View Top으로 설정한다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/96ad4996-2c45-4cc8-a7fe-e08afc35a4d9/image.png" alt=""></p>
<p>Relative to margin도 체크해제 하고, Constant를 0으로 설정한다.
<img src="https://velog.velcdn.com/images/round_pic/post/064ed489-6ce0-4405-ab7b-765f55777d84/image.png" alt=""></p>
<p>스토리보드와 코드를 연결하기 위해 New File을 선택하고, Cocoa Touch Class 파일을 선택한다.
<img src="https://velog.velcdn.com/images/round_pic/post/27004c67-f197-4b42-813d-a82dee851f09/image.png" alt=""></p>
<p>UITableViewCell을 상속한 셀을 만들고, 이름은 FoodCell이라 하였다.
<img src="https://velog.velcdn.com/images/round_pic/post/c528bae5-9874-4fd0-bb73-4f6a56809a44/image.png" alt=""></p>
<p>스토리보드에서 Table View Cell을 클릭하고, Custom Class에 FoodCell이라 입력한다.
<img src="https://velog.velcdn.com/images/round_pic/post/eea5388a-e531-4869-8e23-9af6c92261b9/image.png" alt=""></p>
<p>스토리보드에서 Assistant를 눌러 파일을 연결할 때 잘되지 않으면 &quot;Option&quot;을 누르고 파일을 클릭하면 연결이 된다!
<img src="https://velog.velcdn.com/images/round_pic/post/395d8972-64f6-4f20-bf39-674a33d61eee/image.png" alt=""></p>
<p>UIImageView를 control을 끌고 mainImageView라 설정해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/8c112929-dbd4-44f2-9327-248099fd5396/image.png" alt=""></p>
<p>Label도 동일하게 설정해준다. (foodNameLabel, descriptionLabel)
<img src="https://velog.velcdn.com/images/round_pic/post/5ffa502b-1feb-4d86-a25e-6ae93ebdec59/image.png" alt=""></p>
<pre><code>@IBOutlet weak var mainImageView: UIImageView!

@IBOutlet weak var foodNameLabel: UILabel!

@IBOutlet weak var descriptionLabel: UILabel!</code></pre><p>Models / Views / Controllers 그룹을 만들고,
Models 안에 Food 파일을 추가하였다.
<img src="https://velog.velcdn.com/images/round_pic/post/59685e1a-b9c1-4536-a3b5-da5f1ce17646/image.png" alt=""></p>
<p>Food 파일 안에 데이터를 구축한다.
3개를 하나의 묶음으로 만들었다고 생각하기!</p>
<pre><code>struct Food {
    var foodImage: UIImage?
    let foodName: String
    let foodDescription: String
}</code></pre><p>Assets에 이미지를 추가해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/055182b4-d0aa-4ae1-89b2-30e46f1a4bcb/image.png" alt=""></p>
<p>음식 데이터의 Array는 아래와 같이 표현하였다.</p>
<pre><code>foodDataArray = [
Food(foodImage: UIImage(named: &quot;6.png&quot;), foodName: &quot;센자이료쿠&quot;, foodDescription: &quot;압구정에 위치한 일본라멘 맛집! 가게 입구부터 일본에 있는 라멘집을 통으로 옮긴 것 같은 분위기이다. 간장베이스의 고기라멘인데 면도 생면이라 굵고, 시금치와의 조합이 Good!&quot;)]</code></pre><p>FoodCell이라는 identifier를 가진 cell을 꺼내서 쓸 것이라는 뜻이다.
<img src="https://velog.velcdn.com/images/round_pic/post/fdd3c69d-81ca-496e-a8c4-d4139793d61c/image.png" alt=""></p>
<p>foodDataArray에 접근해서 아이템을 하나씩 꺼내서 할당하게 된다.
<img src="https://velog.velcdn.com/images/round_pic/post/50e2aa44-7bf9-4194-87ed-1a72f30970ef/image.png" alt=""></p>
<p>테이블뷰에 데이터들이 잘 표시되는 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/249324c4-24b0-4413-b91c-2e3201d140a4/image.png" alt=""></p>
<blockquote>
<p>다음에 해야할 것</p>
</blockquote>
<ul>
<li>네비게이션바 적용</li>
<li>상세 페이지 구현</li>
<li>데이터 추가하기 기능 구현</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] 네비게이션바&탭바 적용하기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98%EB%B0%94%ED%83%AD%EB%B0%94-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98%EB%B0%94%ED%83%AD%EB%B0%94-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 27 Sep 2022 14:44:49 GMT</pubDate>
            <description><![CDATA[<p>네비게이션바와 탭바는 앱에서 항상 쓰이는 기능이다.</p>
<p>먼저 뷰컨트롤러를 생성해준다.
뷰컨트롤러를 먼저 생성하는 이유는 다음 화면으로 넘어가기 위한 것이다.
<img src="https://velog.velcdn.com/images/round_pic/post/acece603-7009-404f-b875-3349a4bbc7f3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/da03e2c5-20d4-4a89-bffd-9bcba6b9e5bc/image.png" alt=""></p>
<p>button을 생성하여 높이, 넓이를 설정하고, X, Y축을 설정하였다.
<img src="https://velog.velcdn.com/images/round_pic/post/91611ed4-48bd-4c78-8354-acb515fe0cf3/image.png" alt=""></p>
<p>control을 누르고 view Controller에 내려놓고, Show를 선택한다. (네비바를 위해)
<img src="https://velog.velcdn.com/images/round_pic/post/a404f3eb-eb8f-45ee-9434-887fee70053d/image.png" alt=""></p>
<p>뷰를 선택하고 Navigation Controller를 클릭한다.
<img src="https://velog.velcdn.com/images/round_pic/post/bb10d4b6-a86d-4892-a85d-aba0635b2005/image.png" alt=""></p>
<p>Navigation Controller가 왼쪽에 생겼다.
<img src="https://velog.velcdn.com/images/round_pic/post/8f04215d-ca7b-4d09-bac7-6fc11fd7c7b1/image.png" alt="">
상단 메뉴가 생긴 것을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/e07b4324-c2a6-4dd5-9598-01a7ece87b3e/image.png" alt=""></p>
<p>Navigation Item을 선택하고, Title명을 메뉴로 수정하였다.
<img src="https://velog.velcdn.com/images/round_pic/post/8ba5b7a7-916e-47b4-a776-8b84ab9c5bc0/image.png" alt=""></p>
<p>Navigation Bar 클릭 후, Scroll Edge로 설정하여 네비게이션 바의 색깔을 설정할 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/bebdfcc3-a5c4-4184-9b62-e2f46d5fe54f/image.png" alt=""></p>
<p>Navigation Controller 선택하고, Tap Bar Controller를 클릭한다.
<img src="https://velog.velcdn.com/images/round_pic/post/c3475311-227b-4569-a982-ba583ef1f656/image.png" alt=""></p>
<p>왼쪽 끝에 Tap Bar Controller가 생성된 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/61fe29c3-dbaf-44bb-a906-cc84d2ba14da/image.png" alt=""></p>
<p>View Controller를 하나 더 추가해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/abccd989-059f-4037-9258-65859cf296c0/image.png" alt=""></p>
<p>control을 끌어 Relationship Segue의 view controllers를 클릭한다.
<img src="https://velog.velcdn.com/images/round_pic/post/a8320722-6f38-4111-809a-a0cb3fe7f225/image.png" alt=""></p>
<p>탭바가 하나 더 생긴 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/78da896d-ae5f-43f7-be00-24ffa37bc8b0/image.png" alt=""></p>
<p>Tab Bar Item을 선택한 상태에서 title과 image를 수정할 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/8761c484-d931-44fe-a65f-1c05ad9a9443/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/91be076f-243f-43c9-b881-734fb7408192/image.png" alt=""></p>
<p>Storyboard로 탭바와 네비게이션바를 제작하는 것은 간편하게 만들 수 있다. 
<img src="https://velog.velcdn.com/images/round_pic/post/73e81c4d-5847-48a8-9380-6e57db314eff/image.png" alt=""></p>
<p>(+) 자판기 메뉴 선택처럼 각 메뉴 버튼을 누르면 상세 페이지로 이동하게 된다.
<img src="https://velog.velcdn.com/images/round_pic/post/3ebe281b-d776-462e-88b6-61c05d0360bc/image.png" alt=""></p>
<blockquote>
<p>다음에 해야할 것</p>
</blockquote>
<ul>
<li>코드로 네비게이션바/탭바 만들기</li>
<li>테이블뷰 적용하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS]디자인 패턴(Design Pattern)]]></title>
            <link>https://velog.io/@round_pic/iOS%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4Design-Pattern</link>
            <guid>https://velog.io/@round_pic/iOS%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4Design-Pattern</guid>
            <pubDate>Mon, 26 Sep 2022 14:33:00 GMT</pubDate>
            <description><![CDATA[<p>디자인 패턴은 객체지향 프로그래밍 설계를 할 때 자주 발생하는 문제들에 대해 재사용할 수 있도록 만들어놓은 패턴들의 모음이다.</p>
<p>GoF(Gang of Four) 디자인 패턴
<img src="https://velog.velcdn.com/images/round_pic/post/55dad6c7-49e5-440a-96ba-742d6b176a91/image.png" alt=""></p>
<p>디자인 패턴을 사용하는 이유
재사용을 용이하게 하고, 유지보수에 효율적이다.
이미 검증되고 테스트한 구조이기 때문에 설계 과정의 속도를 높일 수 있다.</p>
<p>단점
객체지향적 설계를 고려하여 진행해야 하기 때문에 초기 투자 비용(시간, 돈)이 많이 들어감</p>
<blockquote>
<p>프로그램 구조의 대표적인 디자인 패턴 중 하나인 MVC Structural Pattern</p>
</blockquote>
<p>MVC란 Model View Controller의 약자로 에플리케이션을 세가지의 역할로 구분한 개발 방법론이다. 아래의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다. 
<img src="https://velog.velcdn.com/images/round_pic/post/2a5a6fa4-609f-4572-8f95-02eba2fde70c/image.png" alt=""></p>
<p>Model - 비즈니스 로직
View - UI 사용자 화면
Controller - Model과 View 사이 중재자 역할, 모델의 정보를 어떻게 뷰에 표시할지 해석</p>
<p>View Controller를 구분하여 표현한다면
코드를 업데이트하거나 유지보수를 할때 코드를 용이하게 관리할 수 있다.</p>
<blockquote>
<p>서로의 소통 방법 </p>
</blockquote>
<p>IBoutlet : controller가 view에게 업데이트된 내용 전달
IBAction : view가 controller에게 이벤트 전달
controller가 model에게 말을 거는 방법 - model의 인스턴스 생성 
model이 controller에게 말을 거는 방법 - 자신의 데이터가 변화될때 등 필요한데, 변경 사항이 있을 때 Notification 하게 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] textField에서 Delegate Pattern 사용하기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-textField%EC%97%90%EC%84%9C-Delegate-Pattern-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-textField%EC%97%90%EC%84%9C-Delegate-Pattern-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 21 Sep 2022 00:46:58 GMT</pubDate>
            <description><![CDATA[<p>textField에서 Delegate Pattern은 유저와 커뮤니케이션 하는 용도로 쓰이며 직접적인 동작을 한다.</p>
<p>뷰컨트롤러에서 행위를 판단한다.
<img src="https://velog.velcdn.com/images/round_pic/post/31e81c03-c2f8-4ba8-9cde-45e2fb25e058/image.png" alt="">
UITextFieldDelegate 프로토콜을 채택해야 한다.
textField와 뷰컨트롤러가 따로 존재하는데 textField 안에 델리게이트 속성이(대리자 속성) 있다.</p>
<pre><code>textField.delegate = self</code></pre><p>self는 뷰컨트롤러를 의미한다.</p>
<p>대리자는 메서드를 하나하나 채택해서 메서드를 구현한다.</p>
<p>델리게이트 패턴 == 대리자
어떤객체와 객체간의 의사소통(커뮤니케이션)
의사소통을 하기 위해 프로토콜을 사용</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/df302a9a-18d2-4f25-8a67-748ded6db938/image.png" alt=""></p>
<p>예를 들어, 유저가 아이디를 입력할 때 10글자까지만 허용한다는 상황에서</p>
<pre><code>func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -&gt; Bool {

        let maxLength = 10
        let currentString: NSString = (textField.text ?? &quot;&quot;) as NSString
        let newString: NSString =  currentString.replacingCharacters(in: range, with: string) as NSString

            return newString.length &lt;= maxLength

    }</code></pre><p>이러한 코드를 작성할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/496b5e05-16a7-4e99-8efe-65dc82c45f49/image.png" alt=""></p>
<p>텍스트필드에서 항상 키보드를 나타내고 싶을 때</p>
<pre><code>textField.becomeFirstResponder()</code></pre><p><img src="https://velog.velcdn.com/images/round_pic/post/97dbefc3-2f70-4319-9017-4cd3538c4112/image.png" alt=""></p>
<p>텍스트 입력 후 Done버튼을 누르면 키보드가 사라진다.</p>
<pre><code>textField.resignFirstResponder()</code></pre><p><img src="https://velog.velcdn.com/images/round_pic/post/021ec3c3-08c7-48d7-b8f2-186a8ba483cc/image.png" alt=""></p>
<pre><code>override func touchesBegan(_ touches: Set&lt;UITouch&gt;, with event: UIEvent?) {
        self.view.endEditing(true)
    }</code></pre><p>textField에서 기본적인 기능은 델리게이트 패턴 없이 사용할 수 있지만
고급 기능을 구현하고 싶을 때에는 델리게이트 패턴을 적용해 편리하게 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS][Swift] textField 만들기]]></title>
            <link>https://velog.io/@round_pic/iOSSwift-textField-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@round_pic/iOSSwift-textField-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 19 Sep 2022 13:07:27 GMT</pubDate>
            <description><![CDATA[<p>텍스트필드는 유저에게 글자 입력을 받는 기능이다.
Ex] id입력, password입력 등등</p>
<p>text를 입력할 수 있는 Text Field와 button을 추가하여
Storyboard에서 UI를 설정해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/521afa29-0bfa-40aa-b4ba-4ff46cd04f3b/image.png" width="80%" height="80"><img src="https://velog.velcdn.com/images/round_pic/post/b83165f6-5103-4497-bb4f-0cf3be2fd219/image.png" width="80%" height="80"></p>
<p>설정 후, storyboard에서 위치와 사이즈를 조정한다.</p>
<img src="https://velog.velcdn.com/images/round_pic/post/c55087f6-51e5-4899-a415-19a46d2998c0/image.png" width="80%" height="80">
Text Field와 button 사이의 간격인 Spacing도 설정해준다.
<img src="https://velog.velcdn.com/images/round_pic/post/cb02ded3-9685-469e-bdc2-2c2506570a52/image.png" width="80%" height="80">




<p>UI화면 설정 후, 코드와 연결하기 위해 Assistant를 클릭하여 코드를 작성한다.
<img src="https://velog.velcdn.com/images/round_pic/post/e107ea04-053c-4452-9079-e6ffa237a6fe/image.png" width="80%" height="80">
control을 누르고, textField(UITextField)와 button(UIButton)을 연결한다.</p>
<img src="https://velog.velcdn.com/images/round_pic/post/a19d6a90-13ca-42f7-9a01-541ebe36e256/image.png" width="80%" height="80">
<img src="https://velog.velcdn.com/images/round_pic/post/4ec4be26-5966-4b98-ab24-fdd19ee758cb/image.png" width="80%" height="80">
Simulator을 실행하면 textField에 선이 희미하게 나타나는 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/round_pic/post/00baf160-5f6d-4c14-b72d-64aa09c82049/image.png" width="30%" height="30">


<p>함수 setup()을 생성하여 
view의 backgroundColor을 gray로 설정하고,
키보드의 타입을 emailAddress로 표현하였다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/849dbdc3-4d77-47e8-b831-e56c7f3a75fc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/560cfe69-50cd-4bc3-be15-418c5fdeb0cb/image.png" alt=""></p>
<p>키보드의 타입을 numberPad로 설정하면 숫자 키패드가 나타나는 것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/409ea9fa-fda8-471a-9253-2f8708e6af97/image.png" alt=""></p>
<pre><code>textField.placeholder = &quot;이메일 입력&quot;</code></pre><p>textField 안에 &quot;이메일 입력&quot;이라 나타난다.
<img src="https://velog.velcdn.com/images/round_pic/post/c04b4f4c-ceda-4bd9-b303-8e8622608356/image.png" alt=""></p>
<pre><code>textField.borderStyle = .roundedRect</code></pre><p>textField의 모서리가 둥근 모서리가 된다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/a5fd8781-e00f-40aa-8ec5-bf6f88482e74/image.png" alt=""></p>
<pre><code>textField.clearButtonMode = .always</code></pre><p>텍스트를 입력할 때 모두 삭제할 수 있는 x아이콘이 나타난다.</p>
<p><img src="https://velog.velcdn.com/images/round_pic/post/331a1f30-2dda-4560-9c9b-0b8d0da57770/image.png" alt=""></p>
<pre><code>textField.returnKeyType = .next</code></pre><p>키패드의 &quot;return&quot;이 &quot;next&quot;로 바뀌는 것을 볼 수 있다.</p>
<blockquote>
<p>응용하기 (textField를 이용하여 다양한 로그인 페이지 구현해보기)</p>
</blockquote>
<ol>
<li><p>인증페이지 구현
<img src="https://velog.velcdn.com/images/round_pic/post/e91ce0c6-beef-43f7-baff-4586c57d6b14/image.png" alt=""></p>
</li>
<li><p>지그재그 로그인 페이지 </p>
<img src="https://velog.velcdn.com/images/round_pic/post/2b49ea73-ea3e-400a-82e8-ac4789890662/image.png" width="30%" height="30">



</li>
</ol>
<blockquote>
<p>다음 포스팅은 델리게이트 패턴에 대해서 알아보겠습니다!</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>