2013-08-17 166 views
0

我是初學者在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]; 
    } 
} 

後,我改變海峽

#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不會改變。爲什麼?

回答

1

問題是,您只需更改detailItem屬性在DetailViewController中引用的對象,而不是更改對象本身的值。當您在viewDidLoad方法設置self.detailItem,則str財產MasterViewController將繼續指向原始字符串:

前:

MasterViewController.str -> 1234 <- DetailViewController.detailItem 

然後你做self.detailItem = 1233。它不會更改字符串本身的值,但會使detailItem指向一個新的字符串。看下面的圖,它移動從DetailViewController箭頭指向,而不是改變的「1234」本身的內容:

MasterViewController.str -> 1234 
          1233 <- DetailViewController.detailItem 

你想在這裏做的是使用delegate模式以正確通知變化的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; 
}