2012-01-10 57 views
0

我正在研究iOS应用程序。基本上,我的应用程序的一部分有一个大的滚动视图,其他6个滚动视图添加为子视图(使用方法[scrollView addSubview:object.view]),以便它在6个不同的滚动视图之间切换。每个滚动视图都有一些我需要保存内容的文本视图。 在每个子滚动视图中,我向键盘添加了一个inputAccessoryView来添加一个Done按钮,并且当按下此按钮时我想调用一个方法来保存数据,然后删除键盘(后者我已经完成了,我只需要弄清楚保存部分)。 我觉得在我的'超级'滚动视图中有一个方法可以更容易地保存所有的数据,所以我可以在每个子滚动视图中添加几行代码(顺便说一句,这些子滚动视图不是' t从主scrollview分类,它们是UIViewController的子类,所以我不能只使用super),因为我必须将其复制/粘贴到6个不同的文件中。我可以通过在'sub'滚动视图中导入并创建一个新对象来访问'超级'类(具有其他所有其他类的大滚动视图),但我觉得这不是我应该做的。这导致我进入我的下一个问题。 如果以这种方式访问​​更大的滚动视图,试图访问UITextViews的text属性将返回null,而从子滚动视图的类中访问相同的属性将显示文本。访问将scrollview作为子视图和其他一些问题添加的类

请让我知道我是否做了一件完全错误的事情,因为我觉得有6种不同的滚动效果真的是效率低下(但在两个iPod touch,第二代和第四代测试它,没有太多滞后在所有所以也不能太低效,否则它会养猪的内存,使其滞后,右)

感谢, 李

编辑:? 我仍然有这个麻烦。我创建的按钮是以编程方式创建的,所以我无法将其链接到Interface Builder中的第一响应者。有没有办法以编程方式做到这一点?这是我创建inputAccessoryView的代码:

-(void)createInputAccessoryView{ 
inputAccView = [[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, [[UIScreen mainScreen] bounds].size.width, 40.0)]; 
UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 40.0)]; 
UIBarButtonItem *doneBttn = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(endEdit:)]; 
[toolbar setItems:[NSArray arrayWithObject:doneBttn]]; 
[inputAccView addSubview:toolbar]; 
[toolbar release]; 
[doneBttn release]; 
} 

该按钮指向一个将关闭键盘的方法(在同一个类中)。但是,在关闭键盘之前,我需要调用另一种方法来保存数据(这是在不同的类中)。这是否有助于任何人的理解?

+3

我会建议您减少这个问题的大小,并尝试将其分解成多个问题和/或重新组织它。没有人希望筛选出一段文字,并试图想象你在做什么。 – david 2012-01-10 02:11:29

回答

0

发布问题时,显示您的代码。不要只是描述你的代码。当我们看到你在说什么而没有筛选出你认为重要的东西时,我们更容易帮助你。

不过,我想我知道你在做错什么,以及如何帮助你。你说这样的:

我能够在“子”滚动型导入,并创建一个新的对象来访问“超级”类(具有所有其他的在它的大滚动型)...试图访问UITextViews的文本属性返回null

这听起来像你已经把这个在你的孩子滚动视图:

- (IBAction)saveButtonWasPressed:(id)sender { 
    ParentScrollView *parent = [[ParentScrollView alloc] init]; 
    [parent saveEverything]; 
} 

,然后你预期这个新创建的父滚动视图上瘾直至您现有的文本视图。但为什么要连接?从nib加载视图层次结构时,nib加载器会负责使用Interface Builder建立的连接。但是,如果您使用代码创建视图,则必须自己建立连接,而不是。

反正你不应该创建一个新的父滚动视图。您需要发送一条消息到现有的父滚动视图。有几种方法可以做到这一点。在这种情况下,我建议使用响应者链。

您可以在Cocoa Application Competencies for iOS中阅读关于应答链的内容。以下是此问题的重要概念:

  • 当文本视图处于活动状态时,文本视图是链中的第一个响应者。
  • 该文本视图的每个祖先视图都在链中。

您可以挂钩一个按钮,发送事件了当按钮被触摸响应链:

  • 在Interface Builder中,您只需按钮连接到“急救员”占位符(在窗口的左上角区域)。您需要在源代码中定义IBAction,以便在将按钮连接到First Responder占位符时显示IBAction

  • 在代码中,你使用nil作为addTarget:action:forControlEvents:目标参数,如:

    [self.saveButton addTarget:nil action:@selector(saveEverything:) forControlEvents: UIControlEventTouchUpInside]; 
    

如果你勾你的按钮了这种方式,UIKit的将搜索响应链的护理响应saveEverything:消息的第一响应者。在你的情况下,这应该是你的(现有的)父滚动视图。

还有一件事:父滚动视图不是真的把你的保存代码的正确位置。在MVC设计模式中,控制器更合适。幸运的是,如果一个视图有与之相关的UIViewControllerUIViewController也是响应者链中的。所以你可以把你的saveEverything:方法放在你的视图控制器上,而不是你的父滚动视图。

+0

感谢您提供的信息,它帮助我了解我做错了什么。一些事情,但。我无法连接IB中的按钮,因为我以编程方式创建它(因为它位于inputAccessoryView中)。另外,我也没有真正的视图控制器。我开始我的项目为基于视图,但后来改为基于标签(我进入mainWindow.xib并删除了视图控制器,并添加了一个标签栏),所以我的旧viewcontroller类是包含我的父母的视图滚动视图。 我可以创建一个仅用于数据保存目的的控制器吗?如果是这样,我该怎么做呢? – Lee 2012-01-10 20:54:51

+0

我刚刚在阅读您的文章时才意识到的一件事。我真的不想设置方法将所有内容保存到“完成”按钮,我宁愿从另一个方法中调用save everything方法,因为它必须将键盘作为第一响应者。 如果您希望看到我的代码的特定区域,只需询问并发布即可。 – Lee 2012-01-11 23:53:27

相关问题