![](/img/trans.png)
[英]Can't pass a data object to view controller inside a view controller
[英]Why can't this view controller set the text fields of the next view controller?
我有一個視圖控制器,其導航欄帶有完成按鈕和兩個文本字段。 按下完成按鈕后,將調用postInfo
方法。 這是實施:
- (void)postInfo{
ListingViewController* lvc = [[ListingViewController alloc] init];
NSString* listingName = listingNameField.text;
NSString* listingPrice = listingPriceField.text;
NSLog(@"%@", listingName);
NSLog(@"%@", listingPrice);
[lvc.titleLabel setText:listingName];
[lvc.priceLabel setText:listingPrice];
[self.navigationController pushViewController:lvc animated:YES];
}
這里的ListingViewController.h
:
#import <UIKit/UIKit.h>
@interface ListingViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@end
UILabel是通過xib文件設置的,是空的。 將根據要求發布任何其他代碼。
在您執行該操作時,尚未加載下一個控制器的視圖,因此您無法訪問其視圖。 您需要在ListingViewController中創建NSString屬性,並將字符串傳遞給postnfo方法中的字符串。 然后在ListingViewController的viewDidLoad方法中,使用這些屬性來填充標簽(這些標簽將在viewDidLoad運行時加載)。
將您的代碼更改為此。
- (void)postInfo
{
ListingViewController* lvc = [[ListingViewController alloc] init];
[lvc view]; // loads the view
NSString* listingName = listingNameField.text;
NSString* listingPrice = listingPriceField.text;
NSLog(@"%@", listingName);
NSLog(@"%@", listingPrice);
[lvc.titleLabel setText:listingName];
[lvc.priceLabel setText:listingPrice];
[self.navigationController pushViewController:lvc animated:YES];
}
發生這種情況是因為在訪問視圖控制器的view屬性之前,將不會加載視圖並且所有子視圖都是nil。 可以在推送視圖控制器上調用viewDidLoad后配置它們。 調用[lvc view]
會立即加載視圖。
我通常也會得到這個(在使用segues的例子中)。 我通過在destinationController
prepareForSegue
期間設置NSString
屬性而不是IBOutlet
來解決它。 然后在下一個View Controller的viewDidLoad
中,我獲取屬性的值並將其分配給UILabel
。
您可能會發現此答案中的解釋很有用: https : //stackoverflow.com/a/8094146/2358334
如果在您調用的行之后設置斷點
testViewController *viewController = segue.destinationViewController;
在構建和運行項目時,您會發現destinationViewController中的UITextField屬性未在斷點處分配和啟動(內存為0x0)。 同時NSString屬性已經分配並初始化(因此您可以設置其值)。
試着這樣做
首先你需要加載視圖(推送viewcontroller),然后你可以訪問屬性(因為你已經通過IBOutlet創建了視圖
- (void)postInfo{
ListingViewController* lvc = [[ListingViewController alloc] init];
NSString* listingName = listingNameField.text;
NSString* listingPrice = listingPriceField.text;
NSLog(@"%@", listingName);
NSLog(@"%@", listingPrice);
[self.navigationController pushViewController:lvc animated:YES];
[lvc.titleLabel setText:listingName];
[lvc.priceLabel setText:listingPrice];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.