2017-07-27 78 views
0

我需要一些帮助。我在Windows 10的Visual Studio 2017中使用Xamarin IOS。我使用的是故事板,并且我有一个带有2个视图控制器的标签栏控制器。我的视图控制器是A_ViewController和B_ViewController。 我想要做的是点击A_ViewController中的一个按钮,它在后台线程中调用API函数。该函数定期返回一些我希望在B_ViewController中的TextView中显示的字符串。Xamarin,iOS从tabbarcontroller获取viewcontroller的实例

我有API回调工作,可以接收返回的字符串,但我不知道我怎么能得到B_ViewController的实例来更新TextView并显示API返回字符串。

我知道tabbarcontroller有一个属性,其中包含所有视图控制器的实例,因为我可以通过调用“this.TabBarController.SelectedIndex = 1;”来更改视图控制器。但从A_ViewController中,我如何使用tabbarcontroller(或任何其他方式)来获取B_ViewController的实例?

我试着从A_ViewController如下:

B_ViewController vc = this.TabBarController.ViewControllers[1] as B_ViewController; 
    vc.Output_Update("Hello World"); <--- This code creates an exception. 

我2个ViewControllers是这个样子:

public partial class A_ViewController : UIViewController 
{ 
    public override void ViewDidLoad(){ 
     base.ViewDidLoad(); 
     mbtnCallAPI.TouchUpInside += BtnCallAPI_TouchUpInside; 
    } 

    public void BtnCallAPI_TouchUpInside(object sender, EventArgs e) { 
     // Call API here. API Callback will return strings 
     // Send return string to B_ViewController's TextView. 
    } 
} 



public partial class B_ViewController : UIViewController 
{ 
    public void Output_Update(string msg) { 
     mTextView.Text += msg; 
    } 
} 
+0

“此代码创建一个异常” - 什么是特定异常? – Jason

+0

我得到一个空引用异常:对象引用未设置为对象的一个​​实例。我期待看到如何从TabBarController获取B_ViewController的实例。 – user2669496

回答

0

我认为mTextView尚未建立。如果你现在尝试设置文本,它会抛出一个NullReferenceException。

在我看来,这不是一个好的方法来使控制器相互依赖。例如A_ViewController不应该知道B_ViewController。取而代之的是将响应字符串保存在某处,并在B_Controller可见时更新文本视图。

+0

mTextView只是B_ViewController中的一个视图。它已经创建,因为B_ViewController的ViewDidLoad()已经执行。我只是找不到从TabBarController引用B_ViewController实例的方法。我同意视图控制器之间的紧密耦合并不是一个好的设计,但由于屏幕空间有限,我使用B_ViewController作为A_ViewController的扩展,以显示不适合一个VC的数据。 – user2669496

+0

如果不适合,为什么不使用UIScrollView? –

相关问题