【问题标题】:Creating a UISwitch Programmatically以编程方式创建 UISwitch
【发布时间】:2011-01-02 19:23:22
【问题描述】:

为了了解更多有关 iphone 开发的信息,我一直在尝试使用苹果开发者网站提供的一些源代码。我正在使用的特定示例是 Core Data Books,发现 here。 DetailViewController 和 AddViewController 是以编程方式制作的,因为它们没有任何 xib 文件。我的问题是关于在不使用 IB 的情况下以编程方式将内容添加到视图中。我想在 UITableView 下方放置一个 UISwitch,其中包含有关 DetailView 中特定书籍的详细信息。我该怎么做呢?这是我迄今为止尝试过的:

在 AddViewController 中,我设置了 UISwitch:

@interface AddViewController : DetailViewController {
id <AddViewControllerDelegate> delegate;
UISwitch *onoff;

 }

@property (nonatomic, assign) id <AddViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *onoff;

我还设置了一个 IBAction:

- (IBAction)flip:(id)sender;

然后我在 AddViewController.m 文件中合成它,但没有任何反应。我只需要设置开关并制作它,以便我可以通过我设置的 IBAction 控制它的作用。我知道这很简单,但我想不通。所以,任何帮助将不胜感激!谢谢

编辑 1

所以我按照 viewDidLoad 中的指示实现了代码,如下所示:

   - (void)viewDidLoad {

[super viewDidLoad];    
  UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectZero];
[onoff addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
// Set the desired frame location of onoff here
[self.view addSubview: onoff];

它会抛出两个警告,说“onoff”的本地声明隐藏了实例变量。但即使有这些收益,UISwitch 也能很好地弹出,但是当我移动它或使用它时,它看起来并没有完全正常工作。对于我看起来像这样的操作:

- (IBAction)flip:(id)sender {
if (onoff.on) NSLog(@"On");  
else  NSLog(@"Off");  
 }

当开关打开时,控制台应该读取,当它关闭时,控制台应该读取。正确的?每当我移动它时,它都会在控制台中重复,关闭。如果它打开,或者如果它关闭,它只会炫耀。我到底做错了什么?请帮忙!谢谢

【问题讨论】:

  • 为什么不使用IB?如果您不使用它,那么为什么将事物声明为 IBOutlet 和 IBAction?
  • 哇。好点。我实际上很想使用 IB,但正如我所提到的,我试图让它在不使用 IB 的视图上工作。是否有一种简单的方法可以将 xib 文件添加到仅填充 uitableview 并显示信息单元格的屏幕?谢谢

标签: iphone objective-c uiview uiswitch


【解决方案1】:

编译器正在尝试帮助您。您正在覆盖 viewDidLoad; 中的 onoff 实例变量,因此永远不会设置。在您的 -flip: 方法中,您正在引用一个 nil 控制器。有两种方法可以解决此问题:

(a) 去掉 onoff 的局部声明,只使用你的实例变量

(b) 将 sender 参数转换为 -flip: 作为UISwitch,并访问它:

- (IBAction) flip: (id) sender {
    UISwitch *onoff = (UISwitch *) sender;
    NSLog(@"%@", onoff.on ? @"On" : @"Off");
}

【讨论】:

    【解决方案2】:

    史蒂夫,如果我误解了你的问题,我很抱歉。您是否真的创建了UISwitch 并将其添加到视图层次结构中?您的控制器的 -loadView-viewDidLoad 实现应具有如下代码:

    // Use the ivar here
    onoff = [[UISwitch alloc] initWithFrame: CGRectZero];
    [onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged];
    // Set the desired frame location of onoff here
    [self.view addSubview: onoff];
    [onoff release];
    

    【讨论】:

    • 您好,非常感谢您的帮助。它让 UISwitch 出现了,太棒了!但是,它似乎没有完全工作,请参阅我上面的代码编辑。谢谢
    • 抱歉这个愚蠢的错误。我已经修复了它(参见 Ben Gottlieb 的 cmets)。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2013-03-28
    • 2013-07-25
    • 2013-07-22
    • 2018-06-04
    • 2015-03-17
    • 2013-11-24
    • 2016-01-01
    相关资源
    最近更新 更多