올해는 어떤 선물로 부모님을 기쁘게 해드릴까요?

이제 곧 5월이 얼마남지 않았습니다. 선물 사달라는 자식과 달리, 따로 살고 있는 부모님께 어떤 선물로 찾아뵐까요? 

결혼하여 양가를 챙기기 바쁜 우리들.. 멀리 타지에 사는 우리, 하필 그날이 당직이라 찾아뵙기도 힘든 우리.. 미리 선물이라도 준비하여 마음을 표현하는 건 어떨까요? 물론, 보고싶어하시는 손주와 함께 식사를 하는 게 제일 좋습니다. 

작년 어버이날 선물 TOP10은...

1위
😊 계좌이체보다는 다양한 디자인과 재미를 가득 담은 용돈 박스가 많아 취향에 맞게 재미와 실용성을 함께..

• 플라워 용돈박스
금장미 용돈박스
한약 용돈박스
...
2위
🤣부모님 건강이 가족 모두의 행복입니다. 면역력과 부족한 비타민을 챙겨주세요.

• 면연력 높이는 홍삼
눈에 좋은 루테인
노화방지의 글루타치온
간에 좋은 밀크시슬
장에 좋은 프로바이오틱스 유산균
혈액에 좋은 징코, 니아이신
관절에 좋은 보스웰리아

 
3위
😘나대신 마사지해서 혈액순환과 긴장된 근육을 풀어줄 마사지건입니다.

제품에 따라 가격차이가 심하기에 주변에 구매한 사람에게 직접 후기를 확인하세요

강력한 진동을 원하시는 분들은 하이퍼볼트(트레이너분들이 많이 사용)를 추천합니다. 
4위
😍부모님께 식사준비&설겆이 없이 편하게 식사를 하려면 외식을 추천합니다.

집에서 식사하길 원하신다면, 재료만 준비하면 되는 고기를 추천합니다. 비싼 고기를 맘편히 넉넉하게...
5위
🤣물걸레질도 잘하고, 밧데리도 충전 잘되는 로봇청소기로 부모님의 무릎을 보호해주세요.

확실히, 초기 로봇청소기보다 성능이 좋아졌습니다.
6위
❤️부모님 휴대폰이 2년이 넘었다면, 매일 사용하시는 휴대폰을 바꿔주세요..

요즘 휴대폰 기기를 어떻게 사야하는지 너무 어려워졌습니다. 대리점 가면 왠지 비쌀거 같고...

기기 변경을 원하지 않으시면, 멋진 케이스라도..

7위
🤣 여행은 갈 수 있을 때 많이 돌아다녀야 한다는 말...

멀지 않지만, 낯선 나라로...

지금은 당장 멀리 유럽 부터?
8위
💕엄마의 아이돌..
9위
😍안마기를 사기에는 부담스러운 경우, 다리 맛사지를 찾아보세요. 꽉꽉 힘있게 눌러줘서 TV보시면서 즐기기 좋습니다. 가까운 하이마트에서 한번 체험해 보세요..


10위
😍💕🤣❤️😘😊😂👌

짧은 시간이라도 

"내 얼굴" 보여드리는게 제일 좋은 선물입니다. 

2주전에 배송 주문을 해야 제때 도착할 수 있습니다.

어린이날과 더불어 함께 가족간에 즐거운 시간 보내시기 바랍니다.

 

Posted by 목표를 가지고 달린다
,

3월 누구나 클래식 <이금희의 해설클래식-일상을 만나다>

세종문화회관에서 하는 3월 공연

공연일자 2024. 03. 31(일) 오후 5시
장소 세종대극장
공연시간 90분 (인터미션 없음)
신청 접수 지금부터 ~ 03.10(일) 00시 까지
연령 2017년 이전 출생자 (만 7세미만 관람 불가)
티켓 전석 1천원/3천원/5천원/1만원 (관람료 선택제)
예매 3월 10일까지 신청 접수하고, 당첨자에 한해 2매까지 예매가능
3명 가족이 볼 경우, 2명이 신청해야 함.
비당첨자 잔여석 예매 3월 21(목) 오전 10시부터 ~ 03.31(일)까지 선착순 예매

멀리 이동하기 어렵다면, 예산이 부족하다면..?

굳이 비싼 돈들여 멀리 떠나기 보다는 서울시내에서 작은 비용으로 관람하는 클래식도 일종의 여행입니다.  

신청일자가 5일(3월10일 00:00시 까지) 남았으니, 서두르시기 바랍니다. 당첨자 발표는 3월 13일(수) 15시이고, 당첨자에 한해 티켓 예매를 3월 20일(수) 18시까지 하면 됩니다. 당첨되지 않으신 분들은 3월 21일(목) 10:00 ~ 03.31(일)까지 잔여석 예매를 할 수 있습니다.

Posted by 목표를 가지고 달린다
,

개발 과정에서 기본으로 제공되는 첫화면, Main.storyboard 파일명을 변경할 수 있습니다. 

Main.storyboard 파일명 변경시 오류 발생

스토리보드 파일 속성 창에서 "Is initial View Controller" 속성 값을 체크하면 될 것 같지만 사실 추가 변경작업을 해줘야 합니다.

파일명을 변경했는데, NSBundle 파일에서 Main이라는 storyboard파일이 없다는 오류가 발생합니다. 

NetflixClone[52739:34390677]
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'Could not find a storyboard named 'Main' in bundle NSBundle 
</Users/abdurl/Library/Developer/CoreSimulator/Devices/
B70278F4-87BD-46B7-984B-B63EDE4CEBFC/data/Containers/Bundle/Application/
AE7F576F-36A8-446D-B54F-87C874367AD4/NeflixClone.app> (loaded)'
*** First throw call stack:

(해결방안) 프로젝트 설정 파일 수정(3군데)

1. Main storyboard file base name

2. Application Secene Manifest - Scene Configuration - item 0 - Storyboard Name

Application Secene Manifest - Scene Configuration - item 0 - Storyboard Name

3. Info.plist Values - UIKit Main Storyboard File Base Name

3군데를 모두 변경 후에도 인식하지 못한다면, XCODE를 재실행하여 캐시를 삭제하면 제대로 인식할 수 있습니다. 

 

Posted by 목표를 가지고 달린다
,

Swift 개발에서 RestApi를 호출하여 정보를 받아오는 경우가 많습니다. 그런 경우, 변수명 네이밍 규칙이 본인의 규칙과 다를 경우 CodingKeys를 이용하여 RestApi 명세의 항목과 개발하는 클래스(스트럭처)의 항목을 매핑하여 개발할 수 있습니다.

이때 주의 사항입니다.

struct MovieResult : Codable {
    let trackName : String?
    let previewUrl : String?
    let artworkUrl : String?
    let releaseDate : String?
    let shortDescription : String?
    let longDescription : String?
    
    enum CodingKeys : String, CodingKey {
        case trackName
        case previewUrl
        case artworkUrl = "artworkUrl100"
        case releaseDate
        case shortDescription
        case longDescription
    }
}
  • response값에 특정항목이 없을 경우를 대비하여 String? , Int? 형태로 nil 을 대비한다
  • response항목의 이름을 다르게 사용할 경우, enum CodingKeys : String, CodingKey{ ... } 를 정의한다.
  • enum CodingKeys에 모든 항목을 정의해야 한다. 누락시 오류 발생. 이름을 다르게 사용하고 싶은 항목만 정의(예시:artworkUrl)

만약, enum CodingKeys에 항목을 누락하거나 오타를 치게 되면, 아래와 같이 오류가 발생한다. 

Type *** does not conform to protocol 'Decodable'
Type *** does not conform to protocol 'Encodable'

type does not conform to protocol Decodable, Encodable

 

Posted by 목표를 가지고 달린다
,

20세기 최고의 투자가 - 워런 버핏

 

우리가 위대한 투자자들의 책을 읽는 이유는, 성공을 증명한 이들의 투자방식, 사고, 접근법에 대해 배우기 위해서입니다. 세상 모든 일을 몸소 겪어야 배울 수 있다면 우리는 성공과 실패가 뒤섞인 험난한 삶을 살 수밖에 없습니다. 책을 통해 성공과 실패를 배우고 어떻게 해야 할지를 고민해야 합니다.


종자돈 500만원, 1천만원.. 없어도 그만이야..내 방식대로 해볼래.

투자에 대해 공부하지 않아도 어느덧 주식투자 5년차, 10년차로 주식 매매를 할 줄 아는 사람들


생각해 보면, 이런 종자돈, 투자기간은 작아보여도 하찮은게 아니라, 정말 소중한 돈과 시간입니다. 만약 매년 500만원씩 모을 수 있다면, 5년 또는 10년 후에 여러분은 부동산에도 투자할 수 있는 종자돈을 모을 수 있습니다.

최근 전기차, 2차전지, AI에 투자해서 1년에 10배 수익을 낸 엄청난 소수(!!!)의 사람들이 있지만, 우리는 그들이 운이 좋다고 하지 위대하다고 하지는 않습니다. 그리고 주가가 1년에 10배 오르는 과정에서 100%, 300% 먹은 사람들이 많고 500%, 800% 먹더라도 투자금액이 적은 사람들이 대다수라 생각됩니다. 어떤 것이 나에게 맞는 투자방법인지 고민없이, 그들처럼 한달만에 100% 수익을 목표로 또는 매달 10%를 목표로 투자를 하게되면, 매일 주식 가격에 스트레스를 받아 돈을 벌어도 불안하고, 단타로 초반에는 돈을 벌다가 결국엔 손해를 볼 상황이 될 경우가 많습니다.   

워런 버핏은 매년 20%씩일지라도 전체 금액에 대해 19%씩 수익을 매년 꾸준히 복리로 성장했습니다. 그는 처음에는 주식차트 분석으로 돈을 벌다가 벤자민 그레이엄에게 "가치투자"를 배워 염가 매수 전략을 실행했습니다. 당시 저평가된 주식들이 많아 좋은 투자실적을 나타냈습니다. 그러다 찰리 멍거를 만나 

우량하지 않은 기업을 대단히 싸게 매수하는 것보다 

싸지 않아도 대단히 우량한 기업을 매수하는 것이 훨씬 나은 전략이다.

로 전략을 변경했습니다. 그래서 그는 해자*가 튼튼한 기업(진입 장벽이 높은 기업)에 투자하게 됩니다. 
* 해자 : 성 주위에 적들이 침범하지 못하게 만든 강, 물줄기

  • 경쟁 우위(브랜드 가치나 특허 등)
  • 높은 시장 점유율 내지 시장 장악력
  • 안전마진(경제 위기를 극복할 수 있는 능력)
  • 가격 전가 능력(가격을 인상해도 매출이 크게 감소하지 않는가)
  • 신뢰성(지속적으로 안정적인 수지 혹은 좋은 수치를 보이는가)
  • 규제 관련 규정을 다뤄본 경험(미디어 기업의 경우)
  • 규모상 우위(대량 매매에 따른 비용 절감 등 규모의 경제에서 오는 우위)
  • 네트워크(아마존, 이베이 등 고객 평가 시스템)

하지만 그는 사실 좋은 주식을 기다렸다가 염가에 사는 경우도 많았습니다. 주식 시장이 호황기 일때는 주식을 매도하고 시장을 관망했지만, 시세가 바닥을 치면 매수자로 돌변해 투자했던 것입니다.

주식을 하다보면, "이거 당장 오를 것 같은데?" 하는 생각으로 예수금을 항상 제로로 만드는 사람들이 많습니다. 하지만 투자를 하기 전에 해당 기업에 대해 많은 검색을 하고, 주가가 오르고 있을지라도 기회를 놓칠지라도 진입하는 가격이 충분히 매력적인지 생각하시기 바랍니다. 

들어가서 10% 먹고 나가겠다는 트레이더의 생각이라면 모르지만, 매일, 매시간 주가 변동을 신경쓸 수 없다면, 긴 안목으로 여유를 가지고 투자해야 주가 변경에도 스트레스 없이 좋은 결과를 보실 수 있습니다. 

건승하시길 기원합니다. 

Posted by 목표를 가지고 달린다
,

세상이 변하더라도 변하지 않은 진리 - 투자 제1원칙

위대한 기업에 투자하라 - 필립 피셔

4년 동안 대한민국은 엄청난 변화가 있었습니다.

1. 코인으로 인한 인생 역전한 사람 탄생
2. 아파트 가격 2배 상승으로 인한 많은 사람들의 자산 증식
3. 코로나19시절에 많은 자영업자들의 추락과 함께 이커머스의 상승
4. 테슬라(전기차)로 시작되었지만, 23년부터 시작된 2차전지 테마주 폭등

그 이전에 아등바당 노력했던 것들이 무슨 의미가 있었나 싶을 정도로 노동의 가치와 지루했던 투자는 사라지고, 한방에 한순간의 도전으로 인생 역전하는 사람들이 뉴스에 나오면서, 가만히 있으면 뒤쳐지는 것 같아 불안하고 초조해하는 사람들이 많습니다. 그러다 증권사에서 추천종목 기사를 보면서 투자했다가 물려, 정말 좋은 투자기회를 놓치기도 합니다.

한방, 한순간으로 인한 인생 역전자는 많지 않습니다.

워렌버핏의 책을 읽고, 그가 운영하는 버크셔 해서웨이가 대단한 것은 2차전지를 통해 1년만에 1000%수익을 내는 것이 아니라, 매년 15~25%씩 꾸준히 수익을 내는 것입니다. (복리의 효과) 우리는 2차전지에 투자해서 10배 먹는 것을 기대하는 것이 아니라, 좋은 기업을 찾아 안정적으로 투자자산을 늘리는 것을 목표로 해야 재정적, 정신적으로 안정적인 삶을 살 수 있습니다.

1년 늦게 투자한다고 해서 좋은 기회를 놓칠 수도 있겠지만, 항상 기회는 새로운 모습으로 계속 우리에게 오고 있습니다. 오히려 섣부른 판단으로 좋은 투자처를 찾아도 자금이 없어 기회를 활용 못할 수 있으니 조바심을 내지 않아야 합니다.

* 2차전지를 통해 2배, 3배 먹은 사람들 많이 있을 것입니다. 하지만 그들 대다수의 투자금액은 많지 않을 것이고, 투자금액이 많은 사람들 중 수익률이 300%를 넘는 사람들은 드물 것입니다.

좋은 기업을 찾아야 합니다.

필립 피셔는 좋은 기업을 찾기 위해서는 재무재표는 기본적으로 보고, 미래 성장성도 확인하고, 무엇보다 경영진의 자질이 중요하다고 합니다. 그는 어떤 주식을 살 것인가를 투자 대상 기업을 찾는 15가지 포인트로 정리하였습니다.

1. 적어도 향후 몇 년간 매출액이 상당히 늘어날 수 있는 충분한 시장 잠재력을 가진 제품이나 서비스를 갖고 있는가?
2. 최고 경영진은 현재의 매력적인 성장 잠재력을 가진 제품 생산라인이 더 이상 확대되기 어려워졌을 때에도 회사의 전체 매출액을 추가로 늘릴 수 있는 신제품이나 신기술을 개발하고자 하는 결의를 갖고 있는가?
3. 기업의 연구개발 노력은 회사 규모를 감안할 때 얼마나 생산적인가?
4. 평균 수준 이상의 영업 조직을 가지고 있는가?
5. 영업이익률을 충분히 거두고 있는가?
6. 영업이익률 개선을 위해 무엇을 하고 있는가?
7. 돋보이는 노사 관계를 갖고 있는가?
8. 임원들간에 훌륭한 관계가 유지되고 있는가?
9. 두터운 기업 경영진을 갖고 있는가?
10. 원가 분석과 회계 관리 능력은 얼마나 우수한가?
11. 해당 업종에서 아주 특별한 의미를 지니는 별도의 사업 부문을 갖고 있으며, 이는 경쟁업체에 비해 얼마나 뛰어난 기업인가를 알려주는 중요한 단서를 제공하는가?
12. 이익을 바라보는 시각이 단기적인가 아니면 장기적인가?
13. 성장에 필요한 자금조달을 위해 가까운 장래에 증자를 할 계획이 있으며, 이로 인해 현재의 주주가 누리는 이익이 상당 부분 희석될 가능성은 없는가?
14. 경영진은 모든 것이 순조로울 때는 투자자들과 자유롭게 대화하지만 문제가 발생하거나 실망스러운 일이 벌어졌을 때는 "입을 꾹 다물어버리지" 않는가?
의문의 여지가 없을 정도로 진실한 최고 경여진을 갖고 있는가?

최근 기사를 보면 에이블씨엔씨에서 한샘으로 이직한 김유진대표가 예상했던 인력구조조정이 아니라 내부 효율화를 통해 흑자전환에 성공한 사례, 바이오업계들이 내부 영업부를 축소하고 영업을 외부 전문업체에 맡기면서 발생하는 외주비가 최근 급격히 증가하여 이익금이 줄어들고 있다는 상황, 경영진의 비리로 문제되고 있는 카카오 전체, 철강 사업 원조 포스코의 해외 자원 사업 진출 성공 등 경영진의 자질에 회사의 가치가 달라진 사례를 확인할 수 있습니다.  

지나친 분산투자로 제대로된 분석없이 증권사의 추천기사로 수많은 종목에 분석없이 들어가기 보다는 분야를 정하고, 서로 다른 섹터(업종)에서 투자종목에 대해 분석한 후, 가격이 충분히 매력적이라고 판단될 때 매수해야  건강한 투자생활을 할 수 있습니다. 

건승합니다.!

Posted by 목표를 가지고 달린다
,

2023년 11월 16일에 시행된 2024학년도 대학수학능력시험 문제와 답안지

아직 중고등학생 자녀를 두신 부모님들께서는 수능 방향, 내신 등 고민들이 많으실 것이라 예상됩니다. 항상 과거를 돌이켜보면 길이보인다는데, 기출문제를 풀면서 방향을 잡고 실력이 쑥쑥 늘어나길 기원합니다. 

고교학점제 등으로 공통과학, 고통수학 등 교과과정에 변경되고, Killer 문항이 사라지면서 전반적인 난이도 조절(지하철에서 이번 수능이 어려웠다는 대화가 많이 들림)에도 대비해야 하는 어려운 시기인 것 같습니다. 

2024학년도 국어, 수학영어 등급별 컷점수

한국교육과정평가원 제공

2024학년도 사회, 과학 등급별 컷점수

한국교육과정평가원 제공
한국교육과정평가원 제공
한국교육과정평가원 제공

 

2024학년도 직업탐구 등급별 컷점수

1교시 국어, 2교시 수학, 3교시 영어, 4교시 한국사 합본

국어, 수학, 영어, 한국사_정답표.pdf
0.06MB
국어, 수학, 영어, 한국사_문제지.pdf
10.83MB
영어영역듣기평가대본.pdf
0.36MB
영어듣기part1.zip
17.67MB
영어듣기part2.zip
18.02MB

4교시 사회탐구영역(생활과 윤리, 윤리와 사상, 한국지리, 세계지리...) zip 파일

사회탐구영역_정답표.zip
0.37MB
사회탐구영역_문제지.zip
14.78MB

4교시 과학탐구영역(물리, 화학, 생명과학, 지구과학) zip 파일

과학탐구영역_정답표.zip
0.32MB
과학탐구영역_문제지.zip
10.43MB

4교시 직업탐구영역(농업, 공업, 상업, 수산해운..) zip 파일

직업탐구영역_정답표.zip
0.25MB
직업탐구영역_문제지.zip
11.69MB

5교시 제2외국어영역(독일어, 프랑스어, 스페인어..) zip 파일

제2외국어영역_독일,프랑스,스페인어.zip
7.32MB
제2외국어영역 그외_문제지.zip
16.20MB
제2외국어영역_정답표.zip
0.37MB

선행하고 있는 중고등학생분들, 이제 수능 앞두고 있는 고2학생분들 모두 힘내시기 바랍니다. 

이제 수능을 보고 한두달 입시 결과를 기다리는 지금의 고3 학생여러분들 고생하셨습니다. 모두 좋은 결과 있으시길 기원합니다. 

Posted by 목표를 가지고 달린다
,

11장. 내비게이션 컨트롤러 이용해 화면 전환하기

12장.  테이블 뷰 컨트롤러 이용해 할일 목록 만들기

#  내비게이션 컨트롤러 이용해 화면 전환하기

가. "Editor-Embed in-Navigation Controller"를 선택합니다.

viewController화면을 클릭한 후, navigation Controller 버튼을 클릭

나. library 팔레트에서 "View Controller"를 끌어다가 메인화면 컨트롤러의 오른쪽 빈 공간에 놓습니다.

View 추가

다. library 팔레트에서 "Bar Button Item"을 찾아 네비게이션 바의 오른쪽에 끌어다 놓습니다. 그리고 Arributes inspector의 system item 에 값을 Edit 등으로 변경합니다.

라. EDIT 버튼을 마우스 오른쪽 버튼으로 클릭한 채 오른쪽의 뷰 컨트롤러에 갖다 놓습니다. 그러면 검은색 창에 Action Segue를 Show로 선택합니다. 그러면 "메인화면"에서 서브화면으로 갔다가 돌아오는 형태를 취하게 됩니다. 그러면 별도의 코딩이 없어도 화면 전환이 가능합니다. 

마. 새로운 화면은 뷰 컨트롤러 클래스 파일이 없어, 메뉴에서 File-New-File.. 에서 Cocoa Touch Class를 선택합니다. SubClass는 UIViewController로 하고 클래스명은 ***ViewController로 저장합니다.

view controller 파일 생성

바. Main.storyboard 파일에서 새로 추가한 뷰 컨트롤러(화면)을 선택한후, Identity inspector를 클릭한 후, Class에 새로 만든 ***ViewController 를 선택하여 연결시킵니다. 

class ViewController: UIViewController {

    var images = ["caterpillar.jpg", "child.jpg", "dahlias.jpg", "strawberry.jpg", "woman.jpg"]
    
    @IBOutlet var imgView: UIImageView!
    @IBOutlet var pageControl: UIPageControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print (images.count)
        pageControl.numberOfPages = images.count
        pageControl.currentPage = 0
        
        pageControl.pageIndicatorTintColor = UIColor.green
        pageControl.currentPageIndicatorTintColor = UIColor.red
        imgView.image = UIImage(named: images[0])
    }

    @IBAction func pageChange(_ sender: UIPageControl) {
        print("current page : ")
        print (pageControl.currentPage)
        imgView.image = UIImage(named: images[pageControl.currentPage])
    }
    
}

사. prepare()함수를 재정의하여 값을 전달하고 전달자가 누구인지는 segue.identifier값을 통해 알 수 있습니다.

class ViewController: UIViewController, EditDelegate {
     

    let imgOn = UIImage(named: "lamp_on.png")
    let imgOff = UIImage(named: "lamp_off.png")
    
    var isOn = true
    @IBOutlet var txMessage: UITextField!
    
    @IBOutlet var imgView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        imgView.image = imgOn
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender : Any?) {
        let editViewController = segue.destination as! EditViewController
        if segue.identifier == "editButton" {
            //버튼을 클릭한 경우
            editViewController.textWayValue = "segue : use button"
        } else if segue.identifier == "editBarButton" {
            //바 버튼을 클릭한 경우
            editViewController.textWayValue = "segue : use Bar button"
        }
        editViewController.isOn = isOn
        editViewController.textMessage = txMessage.text!
        editViewController.delegate = self
    }
    
    func didMessageEditDone(_ controller: EditViewController, message: String ) {
        txMessage.text = message
         
    }
    func didImageOnOffDone(_ controller: EditViewController, isOn: Bool) {
        self.isOn = isOn
        if isOn {
            imgView.image = imgOn
        } else {
            imgView.image = imgOff
        }
    }


}

아.데이터를 전달할 경우, delegate역할의 프로토콜을 작성 및 프로토콜내 함수 정의

import UIKit

protocol EditDelegate {
    func didMessageEditDone(_ controller : EditViewController, message : String )
    func didImageOnOffDone(_ controller : EditViewController, isOn : Bool)
}

class EditViewController: UIViewController {

자. didMessageEditDone함수에서 메시지 전달 : txMessage.text = message

차. EditViewController에서 delegate 변수 생성 : var delegate : EditDelegate?

카. 수정화면의 btnDone()함수 를 통해 메인화면으로 값 전달하는 부분 생성 : delegate?.didMessageEditDone(self, message : txMessage.text!)

타. 메인스토리의 ViewController에서 prepare()문에 한줄 추가 : editViewController.delegate = self

//
//  ViewController.swift
//  Navigation
//
//  Created by abdurl on 2023/09/20.
//

import UIKit

class ViewController: UIViewController, EditDelegate {
     

    let imgOn = UIImage(named: "lamp_on.png")
    let imgOff = UIImage(named: "lamp_off.png")
    
    var isOn = true
    @IBOutlet var txMessage: UITextField!
    
    @IBOutlet var imgView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        imgView.image = imgOn
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender : Any?) {
        let editViewController = segue.destination as! EditViewController
        if segue.identifier == "editButton" {
            //버튼을 클릭한 경우
            editViewController.textWayValue = "segue : use button"
        } else if segue.identifier == "editBarButton" {
            //바 버튼을 클릭한 경우
            editViewController.textWayValue = "segue : use Bar button"
        }
        editViewController.isOn = isOn
        editViewController.textMessage = txMessage.text!
        editViewController.delegate = self
    }
    
    func didMessageEditDone(_ controller: EditViewController, message: String ) {
        txMessage.text = message
         
    }
    func didImageOnOffDone(_ controller: EditViewController, isOn: Bool) {
        self.isOn = isOn
        if isOn {
            imgView.image = imgOn
        } else {
            imgView.image = imgOff
        }
    }


}
import UIKit

protocol EditDelegate {
    func didMessageEditDone(_ controller : EditViewController, message : String )
    func didImageOnOffDone(_ controller : EditViewController, isOn : Bool)
}

class EditViewController: UIViewController {
    
    
    var textWayValue : String = ""
    var textMessage : String = ""
    var delegate : EditDelegate?
    var isOn = true

    @IBOutlet var txMessage: UITextField!
   
    @IBOutlet var lblWay: UILabel!
    
    @IBOutlet var swIsOn: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        lblWay.text = textWayValue
        txMessage.text = textMessage
        swIsOn.isOn = isOn

        // Do any additional setup after loading the view.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

    @IBAction func btnDone(_ sender: UIButton) {
        
        if delegate != nil {
            delegate?.didMessageEditDone(self, message: txMessage.text!)
            delegate?.didImageOnOffDone(self, isOn: isOn)
        }
        //navigationController?.popViewController(animated: true)
        _ = navigationController?.popViewController(animated: true)
    }
    
    @IBAction func swImageOnOff(_ sender: UISwitch) {
        
        if sender.isOn {
            isOn = true
        } else {
            isOn = false
        }
    }
}

 

#  테이블 뷰 컨트롤러 이용해 할 일 목록 만들기

가. 아이폰 모양의 스토리보드의 상단을 드래그 한 후, "delete" 버튼으로 화면에 내용 삭제 : 빈 화면 만들기

나. 프로젝트 내의 ViewControllers.swift파일 삭제

다. Library 팔레트에서 Table View Controller를 선택해서 스토리보드에 올려 놓습니다.

라. 메뉴에서 Editor-Embed in-Navigation Controller를 선택하여 추가(Attributes inspector에서 "is Initial View Controller" 항목에 체크)

마. Library팔레트에서 View Controller를 2개를 선택해서 화면에 추가(화면 2개 추가)

바. Library팔레트에서 "Bar Button Item(바 버튼 아이템)"을 찾아 테이블 뷰 컨트롤러의 오른쪽 윗부분에 배치합니다. "Attributes Inspector"을 클릭한 후, System Item값을 Add로 수정합니다. 

사. 바 버튼 아이템을 마우스 오른쪽 버튼으로 클릭하여 새로 추가한 뷰 컨트롤러(마.에서 추가한 화면)로 드래그 합니다. 그리고 뷰 컨트롤러가 전체적으로 파랗게 되면 마우스 버튼을 놓습니다. 그리고 Action Segue 창에서 Show를 선택합니다. 

.. 이후 부분에 대해서는 내용이 많고, 책이 정리가 잘 되어 있기에 실제 책을 보거나 영상 강의를 보는 것을 추천합니다. 저도 이 책은 여기까지 마무리 하고 최근 구매한 인프런의 강좌를 듣고자 합니다. 

Posted by 목표를 가지고 달린다
,