其他UIviewController和IBActions中的UIViewController

时间:2011-03-14 16:22:58

标签: ipad uiviewcontroller uiscrollview ibaction

我正在设计一个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“按钮”连接到一个名为doS​​omething的方法。但正如我已经说过的那样,它不起作用。

还有一件事。我还尝试以编程方式将一个按钮添加到带有 Mini Controller实例的UIScrollView 中。它工作正常!但我当然相信它是非常硬编码的。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

编辑:View Controller编程指南中的相关引用:

  

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

答案 1 :(得分: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];

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

答案 2 :(得分: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)。