iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (4) 完成
继续《iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (3) 深入Segue,Class,Protocol,Delegate的基本使用》的内容,如果想从头学习Storyboard,请参考《iOS 5 Storyboard 学习之 UITableViews》
1 我们来建立最后一个TableViewController,用来控制类别的选择。托一个“Table View Controller”,从类别 Control+Drog 到新的“Navigation Controller”上然后选择“Push”,Segue的identifier为“PickGame”
设置“Table View Controller”的cell 的 Style为Basic
2 建立“ GamePickerViewController”,Class 是 Table View Controller
然后编辑 “GamePickerViewController.h”
#import <UIKit/UIKit.h>
@interface GamePickerViewController : UITableViewController {
NSArray *games;
}
@end
“GamePickerViewController.m”
-(void)viewDidLoad
{
[super viewDidLoad];
games =[NSArray arrayWithObjects:@"游泳",@"篮球",@"足球",@"象棋",@"国际象棋",@"Dota",nil];
}
- (void)viewDidUnload
{
[super viewDidUnload];
games =nil;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return[games count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"GameCell"];
cell.textLabel.text =[games objectAtIndex:indexPath.row];
return cell;
}
这里别忘了给Cell设置Identifier为“GameCell”
3 一切配置都完成了,我们开始写Delegate类似我们在Player View那里做的一样。
3.1 首先在“ GamePickerViewController.m”中修改为:
@class GamePickerViewController;
@protocol GamePickerViewControllerDelegate <NSObject>
-(void)gamePickerViewController:(GamePickerViewController *)controller didSelectGame:(NSString *)game;
@end
@interface GamePickerViewController : UITableViewController
@property (nonatomic,weak) id <GamePickerViewControllerDelegate> delegate;
@property (nonatomic,strong) NSString *game;
@end
3.2 然后在“ GamePickerViewController.m”中添加和修改
@implementation GamePickerViewController
{
NSArray*games;
NSUInteger selectedIndex;
}
@synthesize delegate,game;
-(void)viewDidLoad
{
[super viewDidLoad];
games =[NSArray arrayWithObjects:@"游泳",@"篮球",@"足球",@"象棋",@"国际象棋",@"Dota",nil];
selectedIndex =[games indexOfObject:self.game];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"GameCell"];
cell.textLabel.text =[games objectAtIndex:indexPath.row];
if(indexPath.row == selectedIndex)
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
return cell;
}
#pragma mark - Table view delegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if(selectedIndex != NSNotFound){
UITableViewCell *cell =[tableView cellForRowAtIndexPath:
[NSIndexPath indexPathForRow:selectedIndex inSection:0]];
cell.accessoryType = UITableViewCellAccessoryNone;
}
selectedIndex = indexPath.row;
UITableViewCell *cell =[tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
NSString *theGame =[games objectAtIndex:indexPath.row];
[self.delegate gamePickerViewController:self didSelectGame:theGame];
}
3.3 回顾一下
3.3.1 可以看出Delegate中唯一的一个方法就是传递选择的类型
3.3.2 选择的类型,会在self.game中,那么它会在ViewDidLoad的时候加载
3.3.3 我们利用“ selectedIndex”会知道我们选择的类型是在self.game中的哪一个
3.3.4 在“cell.textLabel.text =[games objectAtIndex:indexPath.row];”这里我们给Text赋值
3.3.5 然后我们到了最后一步,当我们选择一个cell之后我们回退到上一个view并且把值传回去
4但是目前它是上边这样的,不能回退,所以最后一步我们就让它把值传回去
4.1 回到“PlayerDetailsViewController.h”改为
#import "GamePickerViewController.h"
@interface PlayerDetailsViewController : UITableViewController <GamePickerViewControllerDelegate>
4.2 在 PlayerDetailsViewController.h”中加入Segue部分内容,它是负责把值传递回去的
@implementation PlayerDetailsViewController
{
NSString*game;
}
4.3 在 PlayerDetailsViewController.h”中修改
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"PickGame"])
{
GamePickerViewController *gamePickerViewController =
segue.destinationViewController;
gamePickerViewController.delegate = self;
gamePickerViewController.game = game;
}
}
-(id)initWithCoder:(NSCoder*)aDecoder
{
if((self =[super initWithCoder:aDecoder]))
{
NSLog(@"init PlayerDetailsViewController");
game =@"国际象棋";
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.detailLabel.text = game;
}
#pragma mark - GamePickerViewControllerDelegate
- (void)gamePickerViewController:(GamePickerViewController *)controller didSelectGame:(NSString *)theGame
{
game = theGame;
self.detailLabel.text = game;
[self.navigationController popViewControllerAnimated:YES];
}
-(IBAction)done:(id)sender
{
Player *player =[[Player alloc] init];
player.name = self.nameTextField.text;
player.game = game;
player.rating =1;
[self.delegate playerDetailsViewController:self didAddPlayer:player];
}
看下最后的结果
完整的代码在这里获取 https://github.com/xxd/Storyboard-Multi-Nav
--EOF--
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂