1

我在理解哪些类可以读取其他类中的哪些变量时遇到了一些麻烦。我在网上阅读了很多不同的东西,但似乎在这里找不到任何可靠的东西。在过去的两天里,我确实浪费了试图让我的程序正常工作,但没有类可以读取任何其他类变量。任何帮助将不胜感激。

这是我的 ViewController.h:

@interface ViewController : UIViewController
{
    @public
    NSString *nameOfLabel;
}

@property (strong, nonatomic) IBOutlet UILabel *firstLabel;
- (IBAction)Switch:(id)sender;
- (IBAction)changeLabel:(UIButton *)sender;
-(NSString *) nameOfLabel;
@end

nameOfLabel 是一个公共变量,应该可以被外部类访问,对吧?

视图控制器.m:

#import "ViewController.h"
#import "NewView.h"

@interface ViewController ()
@end

@implementation ViewController

- (IBAction)Switch:(id)sender {
    NewView * new = [[NewView alloc] initWithNibName:nil bundle:nil];
    [self presentViewController: new animated:YES completion:NULL];
}
- (IBAction)changeLabel:(UIButton *)sender  {
    nameOfLabel = @"Test Name";
    _firstLabel.text = nameOfLabel;
}
-(NSString *) nameOfLabel   {
    return nameOfLabel;
}
@end

changeLabel 按钮将 *firstLabel.text 更改为“测试名称”。

第二类是NewView.h:

#import "ViewController.h"

    @interface NewView : UIViewController
    @property (strong, nonatomic) IBOutlet UILabel *secondLabel;
    - (IBAction)changeSecondLabel:(UIButton *)sender;
    @end

和 NewView.m:

#import "NewView.h"

@interface NewView ()
@end

@implementation NewView
{
    ViewController *view;
}
- (IBAction)changeSecondLabel:(UIButton *)sender {
    view = [[ViewController alloc] init];
    _secondLabel.text = view.nameOfLabel;
}
@end

changeSecondLabel 应该将 secondLabel.text 更改为 nameOfLabel ,即“测试名称”,但是,标签实际上消失了,这让我认为无法达到 nameOfLabel。我玩过nameOfLabel,将其设为@property,然后对其进行合成,并尝试将其放入{ NSString *nameOfLabel; } 在@implementation 下,但我仍然得到相同的结果。

4

4 回答 4

0

这一行:view = [[ViewController alloc] init];创建一个的ViewController,它不知道你可能对其他 ViewController 做了什么。在您的情况下,它特别不知道changeLabel:在这个新的 ViewController 存在之前在另一个 ViewController 上调用了它。

于 2012-11-06T20:48:11.593 回答
0

首先请阅读编码标准,这不是一个好习惯:

  1. 命名变量,如“新”

  2. 命名方法,如“开关”

  3. 将 UIViewController 命名为“view”或“NewView”

关于逻辑:这一切都搞砸了。您实际上要做的是创建带有 nameOfLabel 的 viewController,它是空的,并且仅在按下按钮时才更改。我假设你按下那个按钮所以它被改变了。然后在 switch 操作上创建另一个 viewController 并呈现它。然后从新的 viewController 内部创建另一个新的 viewController,它的 nameOfLabel 为空,获取这个空值并将其放入 secondLabel 中。

有几种方法可以更改 secondLabel:

  1. 将 nameOfLabel 移动到模型并在您想要更改 secondLabel 时从那里读取它,
  2. 因为您的新 viewController 是保留 nameOfLabel 的 viewController 的子级,所以您可以通过调用 [[self presentingViewController] nameOfLabel] 来访问它,但首先将其设为属性,
  3. 通过指定的初始化程序传递 nameOfLabel。
于 2012-11-06T20:52:15.283 回答
0

当第二个视图控制器 (NewView) 出现时,它没有引用第一个视图控制器 (ViewController) 和它的数据。

这里有几个建议。

  • 在现代 Objective-C 中,我建议使用属性而不是公开变量。
  • 大体上看一下命名。例如,“ViewController”不是一个好名字。
  • 如果属性是类内部状态的一部分,则在类扩展中声明它。
  • 在呈现第二个视图控制器之前,请设置对来自第一个视图控制器的字符串的引用。

ViewController.m 的一部分:

@interface ViewController ()
@property (copy,nonatomic) NSString *nameOfLabel;
@end

@implementation ViewController

- (IBAction)Switch:(id)sender {
    NewView *new = [[NewView alloc] initWithNibName:nil bundle:nil];
    new.secondLabel.text = self.nameOfLabel;
    [self presentViewController: new animated:YES completion:NULL];
}
于 2012-11-06T20:52:38.340 回答
0

好吧,如果你想简单演示一下公共 ivar 的访问,语法是:

view->nameOfLabel;
    ^^

不是点语法:

view.nameOfLabel;

(点语法只是通过访问器方法)。

这些年来,我只看到少数有保证的边缘案例。很少,很少有充分的理由将 ivar 公开(此外,protected 也很少是一个好的选择)。

于 2012-11-06T21:22:28.043 回答