簡體   English   中英

iOS更改父ViewController的Integer / NSNumber

[英]iOS change Integer/NSNumber of parent ViewController

我有一個具有NSInteger(或NSNumber)屬性的viewController,我想要做的是將整數傳遞給子ViewController,做一些更改(可能添加一些數字)。

但是當我在父控制器和子控制器中使用NSNumber作為屬性並通過set屬性傳遞它時:

//parent and child property.    
@property (nonatomic,strong) NSNumber *num;

//pass to the child
child.num = self.num;

//do some change in child
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];

這不能更改父級的值,因為NSNumber是只讀的,並且在子級中它們分配了一個新的,而不更改父級的值。

所以:

我如何將NSInteger或NSNumber傳遞給子ViewController並更改其中的值,當子彈出時,父控制器得到更改?

您正在以下行中定義和分配新的NSNumber:

self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1];

您不能使用此方法,因為NSNumbers是不可變的。 所以self.num將指向與父的num不同的另一個位置。 為了避免這樣的問題,你可以使用委托模式或簡單地將父的viewController指針傳遞給子節點並更改其num值。

例如:

家長的標題:

@property (nonatomic,strong) NSNumber *num;

孩子的標題:

@property (nonatomic,weak) parentViewControllerClass * parentClass;

碼:

self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1];

PS您可以在這里這里查看如何定義協議。 有了它,您可以實現委托模式。

也許在其他語言中你可以將指針傳遞給指針(我不確定你是否應該 ),但在Objective-C中你不能請求屬性的地址。

可以做的是:

  1. 使用提到的委托模式 - 它意味着什么:
    1. 創建指定setNumber:方法的協議setNumber:
    2. 在父控制器中實現此協議(只需實現setNumber: function)
    3. 將父控制器設置為子屬性,但作為此協議的實例,而不是它的類的實例 - 以保持封裝。
    4. 調用setNumber:來自子控制器
  2. 創建父控制器和子控制器之間共享的可變對象。 例如:

     @interface Counter : NSObject @property (nonatomic) NSInteger value; @end 
  3. 您可以從子控制器發布有關號碼更改的通知,並在父級中觀察它:

     // post notification in child NSNumber *num = [NSNumber numberWithInteger:1]; [[NSNotificationCenter defaultCenter] postNotificationName:@"numberChangedNotification" object:self userInfo:@{@"number": num}]; // observe notifications in parent // first register observer in viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeNumber:) name:@"numberChangedNotification" object:child]; // and implement updateNumber - changeNumber: (NSNotification *)notification { NSNumber *num = notification.userInfo[@"number"]; // ... } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM