【问题标题】:How to pass label value in iphone如何在iphone中传递标签值
【发布时间】:2012-07-30 03:13:29
【问题描述】:

我有两个控制器 A 和 B 在 B 中有一个标签和一个字符串 在A中我写了下面的代码

B *ObjB =[[B alloc]initWithNibName:@"B" bundle:nil];
ObjB.Mylabel.text=[NSString stringWithString:@"Add New name"];
ObjB.MyString=[NSString stringWithString:@"new string name"];
[self.navigationController pushViewController:ObjB animated:YES];
[ObjB release]; 

我只得到 B 中的 ObjB.MyString 值,没有得到标签文本。谁能帮忙。提前谢谢。

【问题讨论】:

  • 你试过在[self.navigationController pushViewController:ObjB animated:YES];之后设置ObjB.Mylabel.text=[NSString stringWithString:@"Add New name"];吗?
  • 这取决于您的需要。您可以创建一个 Singleton 类以在类之间共享数据。可以看我之前的回答如何制作单例类here

标签: iphone objective-c ios


【解决方案1】:

在两个视图控制器之间传递数据的最佳方式是在控制器 B 中声明一个变量来保存标签文本。 在viewController B的头文件中

    NSString *labelText;

//Declare its property and synthesize in .m

在控制器 A 中,在导航到控制器 B 之前,将此变量初始化为所需的文本,即在本例中为“添加新名称”。

B *ObjB =[[B alloc]initWithNibName:@"B" bundle:nil];
ObjB.labelText = [NSString stringWithString:@"Add New name"];
ObjB.MyString = [NSString stringWithString:@"new string name"];
[self.navigationController pushViewController:ObjB animated:YES];

接下来在控制器 B 的 viewDidLoad 中,将标签的文本分配给包含字符串的变量。

ViewDidLoad of B
MyLabel.Text = labelText;
//Assuming you have mapped MyLabel to the IB. 

我的所有项目都使用 ARC,所以我不使用 release 命令。

【讨论】:

    【解决方案2】:

    这解决了我的问题

    B *ObjB =[[B alloc]initWithNibName:@"B" bundle:nil];
    [self.navigationController pushViewController:ObjB animated:YES];
    ObjB.Mylabel.text=[NSString stringWithString:@"Add New name"];
    ObjB.MyString=[NSString stringWithString:@"new string name"];
    [ObjB release]; 
    

    感谢您的及时回复

    【讨论】:

    • 请遵循@Alladinian 的解决方案。我不确定您的方法是否会始终导致在标签上设置属性之前创建视图层次结构。
    【解决方案3】:

    假设 MyLabelUILabel (旁注:避免 ivars 的大写名称 - 在 Objc 中,大写名称 [按约定] 用于类),未设置值的原因是因为视图层次结构您的B 控制器尚未加载(即此时您的标签为nil)。所以你有三个选择:

    1. 强制加载视图层次结构并设置标签:

      [ObjB loadView]; // Note: Apple says that you never should call this directly (just to illustrate my point)!!

    2. 先请求视图,让系统为你加载层次结构:

      id view = ObjB.view; // This is a bit of a 'hack' actually

    3. 只需在 B 控制器中添加另一个属性,设置它,然后在 viewDidLoad 上设置标签的文本(我认为这是最好的选择)

    【讨论】:

    • 我不会强制加载视图层次结构。视图被延迟加载是有原因的,让系统决定何时加载它。当系统决定加载视图时存储数据和填充标签的第二种选择要好得多。
    • @Stew 同意。这就是为什么我的 cmets 中有感叹号 :)
    • 对不起,第一次错过了。我只提供选项#3,其他都是我不推荐的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2017-08-26
    • 1970-01-01
    • 2010-11-23
    • 2017-04-08
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多