2016-05-11 69 views
0

我有一個類似於此的子視圖: item selectoriOS使用模態視圖控制器的返回值

ItemSelector:

class ItemSelector: UIView { 
    weak var delegate: ItemSelectorDelegate? 
    // ... 
    func addButtonPressed(button: UIButton) { 
     // called when "+" button is pressed 
     let confirmed = delegate?.addItemOrNot() // delegate function 
     if confirmed! { /* update ui */ } 
    } 
} 

MainViewController:

class MainViewController: UIViewController, ItemSelectorDelegate { 
    @IBOutlet weak var itemSelector: ItemSelector! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     itemSelector.delegate = self 
    } 

    func addItemOrNot() -> Bool { 
     performSegueWithIdentifier("AddOrNot", sender: self) 
     return ??? // results from modal view controller 
    } 
} 

當按下 「+」 按鈕,含有模態的視圖控制器 「是」/ 「否」 按鈕將顯示。如果用戶選擇「是」,則addItemOrNot()函數將返回true;否則它返回false,視圖將保持不變。我已經把控制器連接起來了。

如何根據我在模態視圖控制器中按哪個按鈕返回布爾值?我該如何使用addItemOrNot()函數中的返回值?

回答

0

您可以達到使用代表的目的。

func addItemOrNot() -> Bool { 
    performSegueWithIdentifier("AddOrNot", sender: self) 
    return ??? // results from modal view controller 
} 

這裏,

設置你現在視圖控制器作爲模態視圖控制器的代表

modalViewController.delegate = self 

當模態視圖控制器是越來越取消或在說解僱case,用你想要傳遞的布爾值調用委託方法

[self.delegate onCancel:YES/NO]; 

這是在模態視圖控制器被解除時寫入的。

然後,一旦你收到這個值,你可以將它傳遞給你想要的功能。

+0

感謝您的幫助,但我仍然有一個問題。 正如你所說,我已經將我的根VC設置爲委託,並且我在根VC中使用了一個變量來存儲要返回的布爾值。 但是,addItemOrNot()函數有沒有辦法讓模態VC中的結果發生變化並在接收到值後解除該值? –

+0

如果你執行segue,就像你已經顯示的那樣,在執行segue之前,你將根VC設置爲委託,那麼根VC中的那個方法將從那裏調用,你可以實現你想要的。 –

+0

我只是不能直接從另一個函數返回模態vc的結果。它的結果(布爾值)存儲在一個變量中,所以這意味着在**更新之前我總是使用舊值**。有沒有辦法可以替代「???」在我的代碼中,模態VC的**立即**結果? –

0

考慮兩個視圖 - 控制爲A和B.

現在B都A.

的公共變量或實例時呈現B將A的該實例從A視圖 - 控制自我。

所以你乙Vc的獲得實例或A的參考

現在

您可以通過使用

A.

的該實例調用的任何公共函數或方法從 乙駁回B時的那麼修改VC通過使用B.聲明A的實例

希望這將有助於:)

+0

謝謝你的回答!我設置了一個公共變量來存儲要返回的Bool值,並且我改變了B中的Bool值。但是有沒有辦法讓A中的函數「等待」Bool值的變化,然後返回新值? –

+0

我不明白你問的問題 – Lion

+0

我只是不能直接從另一個函數返回模態vc的結果。它的結果(布爾值)存儲在一個變量中,所以這意味着在**更新之前我總是使用舊值**。有沒有辦法可以替代「???」在我的代碼中,模態VC的**立即**結果? –

0

我喜歡做的是在主視圖控制器,我有一個方法「myUnwindAction」這就是所謂當細節視圖控制器是cl osed。詳細視圖控制器在returnMethod值中存儲「是」或「否」。 當詳細視圖控制器被解僱時,unwindSegue被調用。在故事板中,您需要將詳細視圖控制器中的「退出」繼續按鈕拖動到主視圖控制器。

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue { 
    DetailViewController *dvc = (DetailViewController *)[unwindSegue sourceViewController]; 
    int returnMethod = [dvc returnMethod]; 
    NSLog(@"Return Action: %d",returnMethod); 
}