2015-12-14 64 views
1

我有一個具有NSInteger(或NSNumber)屬性的viewController,我想要做的是將整數傳遞給子ViewController,做一些改變(也許增加一些數字)。iOS更改父ViewController的整數/ NSNumber

但是,當我在父母和孩子控制器使用的NSNumber財產和設置屬性傳遞:

//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的是隻讀的,在孩子,他們ALLOC一個新的,沒有改變父母的價值。

所以:

我如何傳遞一個NSInteger的或者NSNumber的孩子的ViewController和它更改值,而當孩子遠離流行,父控制器得到改變?

+1

您可以使用委託模式這一點。 – trojanfoe

+0

你能告訴我一些代碼模式的代碼嗎? – FisherMartyn

回答

3

您定義和下面的行分配新的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]; 

附:您可以查看如何定義協議herehere。有了這個,你可以實現委託模式。

+0

太可怕了。更正常的是有一個像'setSomeNumber:(NSUInteger)數字'委託方法''而不是像這樣外部創建屬性。 – trojanfoe

+0

@trojanfoe完全同意,但我已經表示他可以在表達此示例之前使用委託模式。我將添加一些代碼以展示如何使用委託。 – Amir

+0

我沒有看到任何可怕的事情。它甚至不是代表;它只是一個簡單的屬性操作,孩子在父母上進行操作。 – NRitH

0

也許在其他語言中,你可能指針的指針(我不知道,如果你應該),但在Objective-C,你不能要求物業地址。

什麼你可以做的是:

  1. 使用提到委託模式 - 這意味着什麼:
    1. 創建協議,規定像setNumber:
    2. 方法在父控制器實現此協議(只是實現setNumber:函數)
    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"]; 
        // ... 
    } 
    
相關問題