[英]Property don't update
我是iOs編程的初學者。 我有問題 我有MasterViewController,下面的代碼
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface MasterViewController () {
}
@property (strong, nonatomic) NSString *str;
@end
@implementation MasterViewController
- (void)awakeFromNib
{
[super awakeFromNib];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.str = @"1234";
}
然后將屬性“ str”發送到DetailViewController。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSString *object = self.str;
[[segue destinationViewController] setDetailItem:object];
}
}
之后,我更改str
#import "DetailViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.detailItem = @"1233";
}
之后,我回到MasterViewController,但是str不會改變。 為什么?
問題在於您只是更改了detailItem
屬性在DetailViewController
引用的對象,而不是更改對象本身的值。 當您在viewDidLoad
方法中設置self.detailItem
時, str
屬性MasterViewController
將繼續指向原始字符串:
之前:
MasterViewController.str -> 1234 <- DetailViewController.detailItem
然后,您執行self.detailItem = 1233
。 它不會更改字符串本身的值,而只是使detailItem指向新字符串。 看下面的圖,它移動了從DetailViewController指向的箭頭,而不是更改“ 1234”本身的內容:
MasterViewController.str -> 1234
1233 <- DetailViewController.detailItem
您要在此處執行的任務是使用委托模式將明細控制器中的更改正確地通知給MasterViewController並為其提供對新值的訪問權限。
DetailViewController.h:
// declare the delegate protocol
@class DetailViewController;
@protocol DetailViewControllerDelegate <NSObject>
-(void)detailViewControllerChangedDetailItem:(DetailViewController *)detailController;
@end
@interface DetailViewController
// add a property for the delegate
@property (nonatomic, copy) NSString *detailItem;
@property (nonatomic, weak) id <DetailViewControllerDelegate> delegate;
@end
DetailViewController.m:
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// notify the delegate whenever the detailItem changes
[self.delegate detailViewControllerChangedDetailItem:self];
}
}
MasterViewController.m:
// mark this as implementing the delegate protocol
@interface MasterViewController () <DetailViewControllerDelegate> {
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSString *object = self.str;
// wire up the delegate connection
[[segue destinationViewController] setDelegate:self];
// now whenever detailItem changes in the DetailViewController,
// it will notify its delegate (the master VC)
[[segue destinationViewController] setDetailItem:object];
}
}
// implement the delegate method
-(void)detailViewControllerChangedDetailItem:(DetailViewController *)detailController
{
// now you can get a copy of the new detailItem value
// and do whatever you want with it.
self.str = detailController.detailItem;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.