第二周的課程好多,內(nèi)容也好多氮采,其中很多的東西自己還沒有徹底搞明白体捏,所以筆記就記一下第二周作業(yè)中的思考好啦,畢竟第二周作業(yè)中對于基礎一般的萌新來說還是有一些花時間的梗摇。
第二周的作業(yè)首先要在Interface Builder中創(chuàng)建好四個ViewController拓哟,同時把四個ViewController的類文件創(chuàng)建好,接著在Interface Builder中把每個VC(ViewController)的控件都擺放好伶授,并使用Button做一個跳轉(zhuǎn)按鈕断序。跳轉(zhuǎn)按鈕就是直接Control?鼠標左鍵將Button鏈接到下一個VC就好了。
隨后糜烹,作業(yè)中要做VC之間的回退违诗,這時候需要用到
- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC {
}
這個方法,在你要退回的目標VC的m文件中疮蹦,寫入這個方法诸迟,可以修改其中unwindForSegue為其他方便辨識的名字如unwindToHome等等。然后在準備進行退回操作的源VC中設置一個Button愕乎,并用Control?鼠標左鍵將其與VC上方的exit鏈接阵苇,這時候會彈出下拉菜單,里面就有之前寫好的目標VC中的unwind方法感论,選擇相應的即可绅项。
第二周作業(yè)中比較麻煩的是傳值,課程里提到用Segue的方式來傳值比肄,還講到可以利用Delegate來傳值快耿,不過Delegate我還沒整明白呢= =所以選擇了Segue來傳值。
利用Segue來傳值芳绩,我們要用到課程中提到的這個方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
在這個方法中,segue參數(shù)包含重要的3個屬性:
@property (nonatomic, readonly) NSString *identifier; ? //控制器標識符
@property (nonatomic, readonly) id sourceViewController; ? ?//源控制器
@property (nonatomic, readonly) id destinationViewController; ? ?//目標控制器
sender是觸發(fā)這個場景切換的事件源,也就是button掀亥。
然后有兩種方式進行傳值,一種是通過目標場景進行傳值示括,另一種是通過屬性傳值铺浇。
第一種目標場景進行傳值如下:
UIViewController *destinationController=[segue destinationViewController];
[destinationController setValue:@"傳值成功" forKey:@String];
這里是定義了一個UIViewController類的實例destinationController,令其等于segue的目標控制器垛膝,隨后進行傳值操作鳍侣。
第二種通過屬性傳值,也是我選擇的方法如下:
在源VC的m文件中加入:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"SendValue"]) {
SecondViewController *receive = segue.destinationViewController;
receive.name = self.nameInput.text;
receive.password = self.passwordInput.text;
? ? ? ? }
}
這個方式需要知道Segue的名字吼拥,如上方代碼里的SendValue倚聚,同時還需要定義一個目標VC類下的實例,如SecondViewController *receive凿可,令其等于Segue的目標控制器惑折。
在傳值操作中授账,需要在目標VC的h文件中定義負責接受數(shù)據(jù)的屬性,這樣實例receive才有屬性可以進行賦值惨驶。比如在h文件中如下定義:
@interface ViewController3 : UIViewController
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *password;
@property (strong, nonatomic) NSString *mail;
@end
這樣在定義目標VC的實例后白热,該實例就擁有了這些屬性,可以進行傳值操作了粗卜。
隨后在目標VC的m文件中的viewDidLoad中屋确,可以直接使用receive收到的值傳給目標VC的其它值,比如:
- (void)viewDidLoad {
[super viewDidLoad];
#pragma marks --------將傳入的值傳給文本輸出欄--------
self.nameOutput.text = _name; ? ?//這里的_name即為receive.name
if (![_password? isEqual: @""]) {
self.passwordOutput.text = @"******";
}
self.mailOutput.text = _mail;
// Do any additional setup after loading the view.
}
這樣就完成了利益Segue進行屬性傳值的操作续扔。
最后還有一點值得注意攻臀,貌似利用Segue進行屬性傳值操作只能傳給源VC的下一個VC,如果這個Segue并沒有鏈接至源VC纱昧,是無法跨VC傳遞的刨啸。
還有一個問題,如果在最后一頁利用unwindForSegue添加直接返回首頁的按鈕時识脆,會發(fā)現(xiàn)回到首頁后之前填寫的值還在设联,如果希望清空的話可以在unwindForSegue之后的{}中進行清空操作。
就這樣吧存璃,本萌新繼續(xù)聽課去了QAQ