2014-06-19 15 views
5

我有兩個類,並且想要在按下按鈕時從一個類調用一個方法。我宣佈它在我的.h文件中像這樣:來自另一個UIViewController的調用方法沒有可見的效果

-(void) imageChange; 

我創建的方法在我的.m這樣的:

-(void)imageChange { 
    UIImage *image = [UIImage imageNamed: img]; 
    [_MyImage setImage:image]; 
} 

最後,席力圖召使用另一個類中的方法:

- (IBAction)Done:(id)sender { 

    SecondViewController *theInstance = [[SecondViewController alloc] init]; 
    [theInstance imageChange]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 

} 

但是,當我在視圖控制器中按「完成」時,UIImage不會更改。請注意:imgNSString的值。

+0

您正在創建一個新的'SecondViewController'並更改其圖像。這沒有意義。您需要對現有的'SecondViewController'進行引用並更改其圖像。 – rmaddy

+0

@rmaddy我應該更改哪些代碼? –

+0

@ user3750491,它的變化不大:另外:SecondViewController是否提供了這個視圖控制器? – danh

回答

8

這個問題是一個常見問題的變體:「如何在視圖控制器之間傳遞值」,並且您的代碼代表瞭解決方案的常見嘗試。讓我們從你所做的事開始。

你的應用程序有兩個視圖控制器和視圖堆棧中的視圖,並且你想在它們之間進行通信。這條線:

SecondViewController *theInstance = [[SecondViewController alloc] init]; 

創建SecondViewController的全新實例(ALLOC意味着這個類的一個新實例分配內存)。這條線:

[theInstance imageChange]; 

與它溝通的東西,在你的情況下,它看起來像設置圖像視圖的圖像。然後這條線:

} 

隱含地銷燬該新實例,因爲它再也不會被再次引用。因此,您的代碼能夠成功地與SecondViewController進行通信,但是使用錯誤的實例,這個實例只能存活幾毫秒。

好的,該怎麼辦? @rmaddy說的是去找到SecondViewController的現有實例,並與之交流。如何獲得現有實例取決於我們如何到達這裏。代碼中的dismissViewControllerAnimated讓我認爲這個當前的vc是由SecondVC的一個實例提供的。如果是這樣,

(SecondViewController *)self.presentingViewController 

指向你所需要的。如果我們是在一個UINavigationController,你可以挖通這viewControllers棧,大概在這裏:

NSArray *stack = self.navigationController.viewControllers; 
SecondViewController *secondVC = stack[stack.count-2]; 

但是,儘管所有這可能是從A到B的直線條,這不是很好的設計,因爲它使這個電流視圖控制器依賴於如何呈現的脆弱方式。

因此@CrimsonChris提出了一個考慮委派的好建議。這是大多數人需要與另一個人交流的vc模式。關於如何做到這一點,有很多網絡和SO資源,所以我不會在這裏重複。 Check out this, for example,或谷歌「iOS代表團」。

還有其他一些方法,例如NSNotificationCenter廣播給任何想要溝通的所有人,或者KVO讓SecondVC觀察模型中的變化並作出反應,無論該變化如何或爲何發生。

後兩者的關鍵概念是您的應用程序需要有一個模型,一組描述應用程序狀態的對象。視圖控制器不是模型 - 事實上它們不是,而是而不是模型。他們的工作是瞭解模型更改並相應地修改視圖。

對於您的情況,您發佈的代碼不應該試圖獲取其他視圖控制器中的圖像集,它應該記錄到模型中,無論發生什麼用戶操作都會觸發解僱。當這個vc自動解除時,SecondViewController(假設它現在)會得到一個viewWillAppear。該方法可能是檢查在用戶操作中設置的模型條件的好地方。然後SecondViewController可以自己調用imageChange。

希望已經夠清楚了。祝你好運。

+0

令人驚歎的解釋!謝謝你的一切!你搖滾! –

+2

非常感謝你讓我度過了一天!這是我14歲生日感謝這個特殊的禮物,幫助我修復這個困擾了我這麼久的錯誤! –

相關問題