xcode 用storyboard拉出一个tableviewcell并且拉一个cell,

有没有觉得,storyboard有时候不是很方便,因为所有的东西都要放在一个viewcontroller下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
iOS 开发实用技术导航
NSHipster 中文版
cocos2d 开源 2D 游戏引擎
Google Analytics for Mobile 统计解决方案
Design Guides and Resources
Transcripts of WWDC sessions
Cocoa with Love
Cocoa Dev Central
iOS 开发实用书单
Style Guides
Useful Tools and Services
Sponsored by
国内领先的实时后端云野狗 API 可用于开发即时聊天、网络游戏、实时定位等实时场景传输快!响应快!入门快!
Promoted by
有没有觉得,storyboard有时候不是很方便,因为所有的东西都要放在一个viewcontroller下
21:06:44 +08:00 · 8781 次点击
一个复杂的view,像xib,我可以分开成多个view,然后很分散去布局。但在storyboard下,必需要放到viewcontroller下,结果就是非常乱。或者是我不知道,有什么好办法没有?
29 回复 &| &直到
10:19:24 +08:00
& & 21:24:02 +08:00
storyboard只是提供多一种选择;
一个应用可以多个storyboard,比如将可重用的一个模块(多个ViewController)做一个storyboard,管理起来还是感觉比以前好吧;
也可以和以前的xib混用的,所以旧代码拿过来也没压力。
& & 22:19:55 +08:00
我已经退回到xib了,view复用比较方便。写测试的时候为了从storyboard里面取一个view controller出来必须要给个名字,太麻烦了。
& & 22:39:15 +08:00
我觉得... sb 这种东西... 实在不是完美主义者能用的...
& & 22:48:55 +08:00
我是觉得 segue 管理起来好麻烦;
而且 storyboard 很卡;
小屏幕下完全无法接受;
楼主说的 subview 也是个问题。
& & 23:01:45 +08:00
除非非常简单的ui, 否则全部代码处理,无论是storyboard还是xib都不用,scm太麻烦
& & 23:01:53 +08:00
subView 可以用 container
不过 sb 在 XCode 5 上卡成狗啊。。。。。
& & 23:04:40 +08:00
@ Xcode 5的xib SCM已经不是问题了
一直用xib,不用storyboard
& & 23:12:02 +08:00
@ segue的时候有90%的情况要传一些参数,于是又得去prepareForSegue:里面判断一下identifier,实在是有够麻烦的。而且如果你的App自定义的东西比较多的话,有些地方无法用segue,storyboard很多时候根本不能显示应用真正的流程。做Web开发的时候也没什么storyboard之类的东西,都是一个个view地写过来的,也没发现有什么搞不清流程的情况,我现在觉得storyboard产生的问题比解决的问题还多。 storyboard最有用的功能就是静态的table view了,可以单独用一个storyboard来存放。
& & 23:17:57 +08:00
@ 对啊,如果用 storyboard 控制流程,那么竟然还有个很 bug 的 method:
performSegueWithIdentifier:sender:
这样完全可以调用其他不连接起来的 view 了。
那个 static table view 的确很有用。
& & 23:29:16 +08:00
之前苦于SB多人协作太难弄,所以我一般是能代码就纯代码搞定。不过现在SB似乎在这方面好很多了,而且纯代码上auto layout似乎有点苦啊。。。
& & 23:42:27 +08:00 via iPad
@ 我以前也是用手写代码,现在改storyboard和xib,非常好,推荐
@ 我以为卡是我电脑问题,8g内存还凑合
@ 这个地方也有点麻烦
@ 没太明白
& & 01:04:24 +08:00
Storyboard 一个很强大的功能是 static tableview cell,这个找不到其他解决方案。
其实 Storyboard 和 xib 结合能解决大部分的问题。
& & 01:24:09 +08:00
storyboard可以切分成几个小的,没那么占内存打开也比较快,但是因为无法跨 storyboard 进行 segue,只能按老一套的来,segue的作用就没了。如果 segue 不能真正地显示出整个应用的流程,反而可能会误导人,我觉得还不如不用。而且切分了以后很麻烦的一点是你找一个view controller还得先想想放在哪个 storyboard 里面了。
@
Xcode 5 的 xib 和 storyboard 的格式都改了,简短了许多而且相当可读,合并冲突不成问题。如果花点时间了解一下格式手写 xib 的代码也是有可能的,文档标记语言比起编程语言更适合用来描述界面。
手写界面还用 Auto Layout的话代码量多好多,还是用 Xcode 5 的 IB 吧,可以给你很多有用的提示,也不会强制给你加一堆constrain。 Xcode 4 的是渣渣别提了。
另外 Auto Layout 真的没必要作为默认,有些简单的布局Spring & Structs 更方便。xib 比 storyboard 好的另外一点是 Auto Layout 的设置可以逐个 xib 分开来设置,需要再启用。storyboard 只能一刀切。
我现在是以 xib 为主,偶尔用 storyboard 画画 settings 和 about 界面的table view,觉得挺好的。
对了,用xib有一点很爽的,创建一个view controller其实无需指定xib的名字的。只要你的xib命名跟view controller一样(除后缀名),然后
[[ViewController alloc] init]
iOS会自动找到对应的xib,对于iPad的xib,写成 ViewController~ipad.xib 就行了。
& & 02:29:17 +08:00
@ 我几乎完全同意你说的,合理的结合才是王道,看来现在唯一阻碍我的就是惰性了。习惯了代码控制一切,对Storyboard和xib一直有抵触情绪,不是很熟悉,需要重新适应。
@ 嗯,我是该尝试一下了。
& & 03:50:02 +08:00
曾经试过xib+SB+代码混写……
结论是还是代码顺手,其他两个都能把我的电脑拖死机
果然就算是rMBP顶配也是渣渣啊
& & 10:06:42 +08:00 via iPhone
最近刚好也在纠结这个问题,感谢@
& & 11:57:51 +08:00
@ 我也觉得auto layout挺鸡肋的,比原来那个layout是多了一些功能,但我每次编译都要看到100多个警告,基本上都是autolayout的问题。
@ sb慢是一个大问题,代码效率真心不高,特别是改动的时候,一个项目中有一半以上的代码在处理布局。我最近几个项目完全改成了sb或xib,感觉还是不错的,刚用有点不爽,那是因为离开的舒适区的一种自然反应。
& & 15:47:27 +08:00
@ Auto Layout不鸡肋,只是对于简单的布局来说是杀鸡用牛刀,所以像我上面说的用 xib 来做界面 ,对于需要复杂布局的 view 单独启用 Auto Layout 最合适。
& & 16:59:42 +08:00
等到明年水果推出传说中6寸 iPhone(另一说是4.8寸?)的时候 autolayout 就显神通了
& & 17:21:02 +08:00
@ autolayout概念很好,但只是不好操作,复杂一点的布局弄死人了,复杂的布局应该可以分开设计,这点可以学习CorelDarw或者AI,组合图层点进去之后可以进入到具体的图层进行设计。
@ 复杂的用xib是一个不错的做法
& & 17:28:43 +08:00
@ 我主要是不喜欢那个拖动操作啥的,触控板拖动控件还好说,拖动IB方法简直就是难过啊……
& & 22:13:45 +08:00 via Android
view controller 可以有很多啊。。。我晕
& & 22:15:06 +08:00 via Android
storyboard 里,每个controller都可以有view controlller
& & 22:25:24 +08:00
@ 我的意思是,所有的control都必需放入viewController内,不像xib,可以各View分开放。
& & 13:45:40 +08:00
同感,我还是喜欢xib,不过XCode5好像不能单独创建xib文件了,只能和class文件一起创建
同时,我觉得arc对我来说也是多余
& & 13:46:49 +08:00
@ arc还是不错的,起码我觉得。另外,xib是可以单独创建的,你创建的时候选择view就可以了。
& & 14:23:29 +08:00
@ arc不算真正的gc,只是语法糖,还是习惯自己控制内存。
我回头试下直接创建view,如果可以的话,直接就放弃storyboard
& & 19:34:30 +08:00
新写的项目用Storyboard,除了IB有点卡外,我觉得Storyboard很好用,很多界面的内容都直接通过IB去定义好,流程也画好,只需要在ViewController做一个判断,赋值就可以了。
我觉得用Storyboard做快速建模效率是非常之高的
& & 10:19:24 +08:00
知道为什么用不习惯storyboard么?很简单,就是因为屏幕不够大,换个27寸的iMac就知道storyboard的爽了
& · & 1079 人在线 & 最高记录 1893 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.3 · 53ms · UTC 10:07 · PVG 18:07 · LAX 03:07 · JFK 06:07? Do have faith in what you're doing.为什么我的tableview中一个cell中的的内容老是在另一个cell中出现
[问题点数:60分,结帖人iOSLearn]
为什么我的tableview中一个cell中的的内容老是在另一个cell中出现
[问题点数:60分,结帖人iOSLearn]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。使用Storyboard控制页面跳转&ios开发
之前做的例子,我们经常会用到.xib文件,在其中我们可以进行界面的设计。不过如果想切换视图,我们就得自己写很多代码。自从苹果推出了Storyboard,我们可以在一个编辑区域设计多个视图,并通过可视化的方法进行各个视图之间的切换。如下图:
上图中有两种箭头:左边的箭头表示程序刚开始运行时加载的控制器;右边的称为Segue,这个表示视图之间的切换,或者表示连接Navigation
Controller的Root View Controller。
Storyboard功能强大,通过它不仅可以单独设计每一个视图,还能很简单地实现各个视图之间的切换。
接下来的例子主要显示Storyboard的功能,顺便用Storyboard实现了静态表格等功能。为了显示Storyboard的功能,我们从Empty
Application开始我们的例子。
1、运行Xcode 4.2,新建一个Empty Application,名称为Storyboard Test:
2、打开AppDelegate.m,找到didFinishLaunchingWithOptions方法,删除其中代码,使得只有return
YES;语句。
3、创建一个Storyboard:
在菜单栏依次选择File — New — New File,在弹出的窗口,左边选择iOS组中的User
Interface,右边选择Storyboard:
之后单击Next,选择Device
Family为iPhone,单击Next,输入名称MainStoryboard,并设好Group:
单击Create,这样就创建了一个Storyboard。
4、配置程序,使得从MainStoryboard启动:
先单击左边带蓝色图标的Storyboard Test,然后选择Summary,接下来在Main
Storyboard中选择MainStoryboard:
这样,当运行程序时,就从MainStoryboard加载内容了。
5、单击MainStoryboard.storyboard,会发现编辑区域是空的。拖一个Navigation
Controller到编辑区域:
6、选中右边的View Controller,然后按Delete键删除它。之后拖一个Table View
Controller到编辑区域:
7、我们将在这个Table View Controller中创建静态表格,不过先要将其设置为左边Navigation
Controller的Root Controller:
选中Navigation Controller,按住Control键,向Table View Controller拉线:
松开鼠标后,在弹出菜单选择Relationship - rootViewController:
之后,两个框之间会出现一个连接线,这个就可以称作是Segue。
8、选中Table View Controller中的Table View,之后打开Attribute
Inspector,设置其Content属性为Static Cells:
这样你会发现Table View中出现了三行Cell。在上图你可以设置很多熟悉,比如Style、Section数量等。
9、设置行数:
选中Table View Section,在Attribute Inspector中设置其行数为2:
然后选中每一行,设置其Style为Basic:
设置第一行中Label的值为:Date and Time,第二行中的Label为List;之后选中下方的Navigation
Item,在Attribute Inspector设置Title为Root View,Back Button为Root:
10、我们实现单击表格中的Date and Time这一行实现页面转换,在新页面显示切换时的时间。
在菜单栏依次选择File — New — New File,在弹出的窗口左边选择iOS中的Cocoa
Touch,右边选择UIViewController subclass:
单击Next,输入名称DateAndTimeViewController,但是不要选XIB:
之后,选好位置和Group,完成创建。
11、再次打开MainStoryboard.storyboard,拖一个View
Controller到编辑区域,然后选中这个View Controller,打开Identity
Inspector,设置class属性为DateAndTimeViewController:
这样,我们就可以向DateAndTimeViewController创建映射了。
12、向新拖入的View Controller添加控件,如下图:
然后将显示为Label的两个标签向DateAndTimeViewController.h中创建映射,名称分别是dateLabel、timeLabel:
13、打开DateAndTimeViewController.m,在ViewDidUnload方法之后添加代码:
//每次切换到这个试图,显示切换时的日期和时间
- (void)viewWillAppear:(BOOL)animated {
NSDate *now = [NSDate date];
dateLabel.text = [NSDateFormatter
localizedStringFromDate:now
dateStyle:NSDateFormatterLongStyle
timeStyle:NSDateFormatterNoStyle];
timeLabel.text = [NSDateFormatter
localizedStringFromDate:now
dateStyle:NSDateFormatterNoStyle
timeStyle:NSDateFormatterLongStyle];
14、打开MainStoryboard.storyboard,选中表格的行Date and
Time,按住Contrl,向View Controller拉线:
在弹出的菜单选择Push:
这样,Root View
Controller与DateAndTimeViewController之间就出现了箭头,运行时当点击表格中的那一行,视图就会切换到DateAndTimeViewController。
15、选中DateAndTimeViewController中的Navigation Item,在Attribute
Inspector中设置其Title为Date and Time:
16、运行一下,首先程序将加载静态表格,表格中有两行:Date and Time以及List,单击Date and
Time,视图切换到相应视图,单击左上角的Root按钮,视图回到Root View。每次进入Date and
Time视图,显示的时间都会不同:
17、接下来,我们将要实现,单击List行,显示一个表格,并且单击表格中的某一行,我们可以在新弹出的视图中编辑该行内容。首先创建ViewController文件:ListViewController、ListEditViewController,前者继承UITableViewController,后者继承UIViewController,参照第10步。都不要创建XIB文件。
然后打开MainStoryboard.storyboard,拖一个Table View Controller和View
Controller到编辑区域,调整所有视图在编辑区域的位置,如下图:
设置新拖入的Table View Controller和View
Controller的class属性分别是ListViewController和ListEditViewController,参考第11步。
18、参照第14步,从Root View Controller中的List那一行向List View
Controller拉线,并在弹出菜单也选择Push。然后选中List View Controller的Navigation
Item,设置Title及Back Button都为List,可以参照第9步。
19、向List View Controller中的表格区域拖入一个Table View
Cell,这样其中就有两个Cell了。设置第一个Cell的Identifier属性为GreenIdentifier。向第一个Cell中拖入一个Label,设置其字体颜色为绿色。同样对第二个Cell进行设置,Identifier属性为RedIdentifier,往其中拖入Label,设置字体颜色为红色。两个Label的Tag属性都设为1。
20、打开ListViewController.m,向其中添加代码:
20.1 在#import的下一行添加代码:
@interface ListViewController ()
@property (strong, nonatomic) NSMutableArray *listA
@property (copy, nonatomic) NSDictionary *editedS
20.2 在@implementation之后添加代码:
@synthesize listA
@synthesize editedS
20.3 找到viewDidLoad方法,向其中添加代码:
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:
@"Horse", @"Sheep", @"Pig", @"Dog",
@"Cat", @"Chicken", @"Duck", @"Goose",
@"Tree", @"Flower", @"Grass", @"Fence",
@"House", @"Table", @"Chair", @"Book",
@"Swing" ,nil];
self.listArray =
20.4 找到numberOfSectionsInTableView方法,使其返回1,并删掉#warning。
20.5 找到numberOfRowsInSection方法,删掉#warning,使其返回[listArray
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
// Return the number of rows in the section.
return [listArray count];
20.6 找到cellForRowAtIndexPath方法,修改其中代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSUInteger row = [indexPath row];
NSString *identifier =
if (row%2 == 0) {
identifier = @"GreenIdentifier";
identifier = @"RedIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
UILabel *cellLabel = (UILabel *)[cell viewWithTag:1];
cellLabel.text = [listArray objectAtIndex:row];
21、运行一下,当单击List行时,页面切换到我们List视图:
22、下面实现单击List表格中的某一行,视图切换,并且视图中的内容与之前选中的行相关,然后可以对其进行编辑,返回后,原来的数据也会发生改变。
打开MainStoryboard.storyboard,仿照第14步,从List View
Controller中的两行向List Edit View Controller拉线,在弹出菜单选择Push。这样List Edit
View Controller视图中就出现了Navigation
Item,选中它,设置Title为Edit。这样,单击List表格中的某一行,视图都会切换到List Edit View
Controller。
23、打开ListViewController.m,在@end之前添加代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//获取目的ViewController
UIViewController *destination = [segue destinationViewController];
if ([destination respondsToSelector:@selector(setPreViewController:)]) {
//将自身传递给目的ViewController
[destination setValue:self forKey:@"preViewController"];
if ([destination respondsToSelector:@selector(setSelection:)]) {
//目的ViewController中的selection属性存储的就是需要编辑的内容及其在表格中的位置
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
id object = [self.listArray objectAtIndex:indexPath.row];
NSDictionary *selection = [NSDictionary dictionaryWithObjectsAndKeys:
indexPath, @"indexPath",
object, @"object",
[destination setValue:selection forKey:@"selection"];
在ViewDidUnload方法之后添加代码:
- (void)setEditedSelection:(NSDictionary *)dict {
if (![dict isEqual:editedSelection]) {
editedSelection =
NSIndexPath *indexPath = [dict objectForKey:@"indexPath"];
id newValue = [dict objectForKey:@"object"];
[listArray replaceObjectAtIndex:indexPath.row withObject:newValue];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
24、打开MainStoryboard.storyboard,找到Edit视图,向其中拖一个Text Field:
然后为这个Text
Field向ListEditViewController.h中创建Outlet映射,名称为editText。
25、打开ListEditViewController.h,向其中添加属性:
@property (copy, nonatomic) NSDictionary *
@property (weak, nonatomic) id preViewC
26、打开ListEditViewController.m,添加代码:
26.1 在@implementation的下一行添加代码:
@synthesize preViewC
26.2 找到ViewDidLoad方法,它默认是被注释掉的,去掉其周围注释符,添加代码如下:
- (void)viewDidLoad
[super viewDidLoad];
editText.text = [selection objectForKey:@"object"];
[editText becomeFirstResponder];
26.3 在ViewDidUnload方法之后添加代码:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([preViewController respondsToSelector:@selector(setEditedSelection:)]) {
//结束编辑
[editText endEditing:YES];
NSIndexPath *indexPath = [selection objectForKey:@"indexPath"];
id object = editText.
NSDictionary *editedSelection = [NSDictionary dictionaryWithObjectsAndKeys:
indexPath, @"indexPath",
object, @"object",
//设置上一个ViewController中的editedSelection,由于设置editedSelection方法
//已经重写,从而对应在表格中的数据会发生变化
[preViewController setValue:editedSelection forKey:@"editedSelection"];
27、运行:
单击List行时,视图切换到上面右图所示。然后单击Pig那一行,视图切换到Edit视图,然后编辑内容,之后返回,这样,原来表格中的内容就会发生改变:
最终代码:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 自定义tableviewcell 的文章

 

随机推荐