0

我正在设计一个 iPad 应用程序,其中的小 UIScrollViews 有自己的 UIViewController 。这些控制器在他们的视图中有一个调用 IBAction 方法的按钮。但它不起作用,事实上,它们似乎没有在模拟器中被按下。

这是一些代码,可以让您了解我在做什么。

// In UIViewController A (say the parent or root that have several UIScrollViews)

    MiniViewController * mini = [[MiniViewController alloc]init];
    [scrollView1 addSubview:mini.view];

//repeat the same process a couple of times with different uiscrollsviews and instances of miniviewcontrollers

现在你可以猜到 MiniController 非常简单,我只发布 .h 文件

@interface MiniControlador : UIViewController {
     IBOutlet UIButton * button;
}
@property (nonatomic, retain) IBOutlet UIButton * button;
- (IBAction)doSomething:(id)sender;
@end

您可以看到我使用 Interface builder 将 UIButton“按钮”连接到名为 doSomething 的方法。但正如我已经说过的,它不起作用。

还有一件事。我还尝试以编程方式使用Mini Controller 实例向 UIScrollView 添加一个按钮。它奏效了!但我当然相信它是极其硬编码的。

你怎么看?我会很感激任何建议。

4

3 回答 3

2

Apple 的View Controller Programming Guide是一本重要的读物,它解释了很多关于 Apple 的每屏幕一个视图控制器的理念。

视图控制器的大部分行为都是建立在一次只有一个视图控制器运行的假设之上的。当违反该假设时,行为未定义(或至少未记录)。在这种情况下,您的描述表明将控制器插入其根视图和该根的超级视图(通常是前一个屏幕)之间的响应者链中的正常视图控制器行为不起作用。

虽然您可能会发现初始化方法可以正常工作,但不能保证它们可以正常工作,并且该行为可能会随着未来的操作系统更新而改变。

编辑:来自 View Controller Programming Guide 的相关引用:

您创建的每个自定义视图控制器对象都负责管理单个视图层次结构中的所有视图。在 iPhone 应用程序中,视图层次结构中的视图通常覆盖整个屏幕,但在 iPad 应用程序中,它们可能只覆盖屏幕的一部分。视图控制器与其视图层次结构中的视图之间的一一对应关系是关键的设计考虑因素。您不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,您不应该使用单个自定义视图控制器对象来管理多个屏幕的内容。

于 2011-03-14T21:52:51.183 回答
1

谢谢大家,我终于使用类的对象(我称为 GenericViewController)解决了这个问题。它实际上就像一个普通的 UIViewController,IBActions 可以很好地响应任何事件(即按下按钮)。

我使用 IBOutlet UIView 来包含 UILabel、按钮……等等。

如果有人感兴趣,这里有一些代码。

@interface GenericViewController : NSObject {
  /* Some IBOutlets here*/

     //like a regular UIView of an UIViewController, this holds the rest of the outlets
  IBOutlet UIView * view;
  } 
   //some IBActions here
  }

然后 UIScrollView 只添加每个 GenericViewController 对象的视图

[scrollView addSubview:genericViewControllerObject.view];

如果有人有更好的解决方案,请告诉我:)

于 2011-06-17T21:27:29.177 回答
0

您确定要从您在 InterfaceBuilder 中制作的 xib 加载视图吗?
我在我的应用程序中做类似的事情,它对我有用。
我正在实现这样的init方法:


- (id)init
{
    if (self = [super initWithNibName:@"__your_xib_name__" bundle:[NSBundle mainBundle]])
    {
        // TODO: Add additional initializing here
        // ...
    }

    return self;
}

如果您没有从 xib 加载视图,则不会建立连接(没有初始化 IBOutlets 并且没有触发 IBActions)。

于 2011-03-14T21:52:44.623 回答