第一个视图中的 UISwitch 和第二个视图中的标签

Posted

技术标签:

【中文标题】第一个视图中的 UISwitch 和第二个视图中的标签【英文标题】:UISwitch in a first view and a label in a second 【发布时间】:2011-09-10 23:18:38 【问题描述】:

所以,我想在我的第一个视图中放置一个标签,并在第二个视图中放置一个 UISwitch。 但问题是我无法将所有内容链接在一起.. :/

在我的第一个视图中,我有那个

- (void)onRoff 

    if (mySwitch1.on) 

        test.hidden = YES;
    
    else (test.hidden = NO);


但这里我的 mySwitch1 有一个错误,因为它是在我的 secondView 中声明的。 不知道有没有说清楚,我想在不同的视图中链接一个标签和一个开关..

谢谢!

【问题讨论】:

【参考方案1】:

确实你不是很清楚。你可能想尝试的第一件事是描述你做了什么:

您的两个视图是如何实例化的?

假设您的两个视图是从两个不同的 nib 文件实例化的。

您希望访问标签和开关的对象是什么?

假设它是一个视图控制器。单个视图控制器从两个不同的 nib 文件控制两个视图有点不寻常,但毕竟为什么不呢?

在任何情况下,您都可以将两个 nib 文件的所有者类设置为视图控制器的类。然后在 Interface Builder 中,从第一个视图中,您可以将标签绑定到文件所有者的 UILabel 出口。在 Interface Builder 中,从第二个视图中,您可以将 UISwitch 绑定到文件所有者的第二个出口,类型为 UISwitch

但也许您的onRoff 方法实际上是您的两个视图类之一的方法?同样的思路:你可以将第二个nib文件中的文件所有者设置为第一个视图的视图类,然后将开关绑定到文件所有者的UISwitch出口。

但听起来你的设计可能值得努力......

编辑:在您发表评论后,这里还有一点......

问题在于您的两个视图控制器各自控制不同的页面并且没有理由相互了解。所以你需要一个中间人对象。那可能是另一个控制器。让我们使用应用程序委托。然后,在 SwitchViewController 的 IBAction 方法中,您可以执行以下操作:

- (IBAction) switchChangedValue:(UISwitch *) sender 
  NSString *newLabelText = sender.isOn ? @"On" : @"Off";
  self.labelViewController.label.text = newLabelText;

现在每个人将如何相互了解?首先,每个视图控制器都会通知中间人。这是 SwitchViewController:

- (void) viewDidLoad

  [super viewDidLoad];
  MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
  appDelegate.switchViewController = self;

其次,应用代理需要协调一切:

@interface MyAppDelegate : …
@property (nonatomic, retain) SwitchViewController *switchViewController;
@property (nonatomic, retain) LabelViewController *labelViewController;
@end

@implementation MyAppDelegate

@synthesize switchViewController = _switchViewController;
@synthesize labelViewController = _labelViewController;

- (void) setSwitchViewController:(SwitchViewController *) newSwitchController 
  if (newSwitchController != _switchViewController) 
    [_switchViewController release];
    _switchViewController = [newSwitchController retain];
    _switchViewController.labelViewController = _labelViewController;
    if (_labelViewController)
      _labelViewController.label.text = _switchViewController.switch.isOn ? @"On" : @"Off";
  


- (void) setLabelViewController:(LabelViewController *) newLabelController 
  if (newLabelController != _labelViewController) 
    [_labelViewController release];
    _labelViewController = [newLabelController retain];
    _labelViewController.switchViewController = _switchViewController;
    if (_switchViewController)
      _labelViewController.label.text = _switchViewController.switch.isOn ? @"On" : @"Off";
  

我遗漏了一些细节,但我希望大局清晰。

【讨论】:

感谢您的回复!首先,它是一个 Tabbar 应用程序。所以我想在我的第一个标签中放一个标签,在第二个标签中放一个开关来控制标签。是的,有不同的 nib 文件,它来自视图控制器,是的。但我真的不明白谁将它连接在一起:/ -(void) 方法是最好的方法吗? void 方法是什么意思?如果你想在 viewController 中使用 UIKit 对象并将它添加到你的 nib 文件中,你必须从 viewController 中设置它并将它链接到 nib 中。【参考方案2】:

所以你已经在第二个视图中声明了你的 UISwitch 并在第一个视图中声明了你的标签。你所要做的就是使用 NSUserDefaults 来实现你想要的。在第二个视图本身中有以下方法。不要把它带到第一个视图。

- (void)onRoff 

   if (mySwitch1.on) 
    [[NSUserDefaults standarduserdefaults]setObject:@"off" forKey:@"state"];
    [[NSUserDefaults standarduserdefaults]synchronize];
   
   else 
     [[NSUserDefaults standarduserdefaults]setObject:@"on" forKey:@"state"];
     [[NSUserDefaults standarduserdefaults]synchronize];
   


现在在第一个视图的 viewWillAppear 方法中,只需检查 NSUserDefaults 的值..

-(void)chkState
NSString *tempStr=[[NSUserDefaults standarduserdefaults]objectForKey:@"state"];
   if([tempStr isEqualTo:@"on"]) 
      test.hidden=YES;
   
   else 
      test.hidden=NO;
   

像这样在firstview的viewWillAppear中调用这个方法...... [自我 chkState];

希望这会有所帮助....如果您也想保存开关的状态,那么只需在第二个视图的 viewWilAppear 方法中再次检查 userdefaults 值并基于

【讨论】:

以上是关于第一个视图中的 UISwitch 和第二个视图中的标签的主要内容,如果未能解决你的问题,请参考以下文章

第二个视图中的 AppDelegate 声明

打开 TabBar 子视图

uitableview didselectrowatindex 仅适用于第一个表视图而不适用于同一视图控制器中的第二个表视图?

使用协议应用程序崩溃 ipad

如何使用情节提要为 ipad 的 xcode 中的第一个视图内的第二个视图添加动画

如何在解除第二个控制器后调用第一个控制器中的函数