Xcode 4.6には、ストーリーボードを使用するアプリケーションがあります。 UITableViewをView Controllerクラスに追加しましたが、期待通りに機能しました。ただし、ストーリーボードでUITableViewを削除し、プログラムで同じクラスに追加して戻そうとすると、2つの特定の問題が発生しました。
1)UITableViewCellタイプをサブタイトルタイプに設定しましたが、詳細ラベルは表示されなくなりました。
2)セルを選択したときに発生するセグエは発生せず、セグエを準備することさえ呼び出されず、セルが選択されたときにテーブルビューにメッセージが送信されていないことを示します
関連するコードは次のとおりです。
@interface StatsTableViewController () <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) UITableView *tableView;
@end
@implementation StatsTableViewController
-(UITableView *)makeTableView
{
CGFloat x = 0;
CGFloat y = 50;
CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height - 50;
CGRect tableFrame = CGRectMake(x, y, width, height);
UITableView *tableView = [[UITableView alloc]initWithFrame:tableFrame style:UITableViewStylePlain];
tableView.rowHeight = 45;
tableView.sectionFooterHeight = 22;
tableView.sectionHeaderHeight = 22;
tableView.scrollEnabled = YES;
tableView.showsVerticalScrollIndicator = YES;
tableView.userInteractionEnabled = YES;
tableView.bounces = YES;
tableView.delegate = self;
tableView.dataSource = self;
return tableView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [self makeTableView];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"newFriendCell"];
[self.view addSubview:self.tableView];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"newFriendCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
Friend *friend = [self.fetchedResultsController objectAtIndexPath:indexPath];
**//THIS DATA APPEARS**
cell.textLabel.text = friend.name;
cell.textLabel.font = [cell.textLabel.font fontWithSize:20];
cell.imageView.image = [UIImage imageNamed:@"icon57x57"];
**//THIS DATA DOES NOT APPEAR**
cell.detailTextLabel.text = [NSString stringWithFormat:@"%i Games", friend.gameCount];
cell.detailTextLabel.textColor = [UIColor lightGrayColor];
return cell;
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"detailsView" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//I set the segue identifier in the interface builder
if ([segue.identifier isEqualToString:@"detailsView"])
{
NSLog(@"segue"); //check to see if method is called, it is NOT called upon cell touch
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
///more code to prepare next view controller....
}
}
これらの2つの問題を解決するために、何を忘れているのかわかりません。どんな助けも大歓迎です。
クラスを登録し、dequeueReusableCellWithIdentifier:forIndexPath:を使用すると、dequeueメソッドはセルを返すことが保証されるため、if(cell == nil)句は入力されません。したがって、古い方法で行い、クラスを登録せずに、dequeueReusableCellWithIdentifierを使用します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"newFriendCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
//etc.
return cell;
}
セグエについては、IBではなくコードで作成したテーブルにセグエを作成できないため、呼び出すことができません。再び、以前の方法に戻り、セルを選択すると呼び出されるtableView:didSelectRowAtIndexPath:を使用します。そこにディテールコントローラーをインスタンス化し、コードで移行を行います。
編集後:
追加したコードはそこにありませんでした。 didSelectRowAtIndexPathではなく、didDeselectRowAtIndexPathを実装しました。これを変更すると、セグエが機能するはずです。
あなたはそれが100%動作するかもしれません。
- (void)viewDidLoad
{
[super viewDidLoad];
// init table view
tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
// must set delegate & dataSource, otherwise the the table will be empty and not responsive
tableView.delegate = self;
tableView.dataSource = self;
tableView.backgroundColor = [UIColor cyanColor];
// add to canvas
[self.view addSubview:tableView];
}
#pragma mark - UITableViewDataSource
// number of section(s), now I assume there is only 1 section
- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView
{
return 1;
}
// number of row in the section, I assume there is only 1 row
- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
// the cell will be returned to the tableView
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"HistoryCell";
// Similar to UITableViewCell, but
JSCustomCell *cell = (JSCustomCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[JSCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
// Just want to test, so I hardcode the data
cell.descriptionLabel.text = @"Testing";
return cell;
}
#pragma mark - UITableViewDelegate
// when user tap the row, what action you want to perform
- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"selected %d row", indexPath.row);
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
arr=[[NSArray alloc]initWithObjects:@"ABC",@"XYZ", nil];
tableview = [[UITableView alloc]initWithFrame:tableFrame style:UITableViewStylePlain];
tableview.delegate = self;
tableview.dataSource = self;
[self.view addSubview:tableview];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return arr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
if(cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
}
cell.textLabel.text=[arr objectAtIndex:indexPath.row];
return cell;
}
- (void)viewDidLoad
{
[super viewDidLoad];
tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.delegate = self;
tableView.dataSource = self;
tableView.backgroundColor = [UIColor grayColor];
// add to superview
[self.view addSubview:tableView];
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection: (NSInteger)section
{
return 1;
}
// the cell will be returned to the tableView
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"HistoryCell";
// Similar to UITableViewCell, but
UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.descriptionLabel.text = @"Testing";
return cell;
}
TableViewControllerを使用してtableviewを作成します。
import UIKit
class TableViewController: UITableViewController
{
let tableViewModel = TableViewModel()
var product: [String] = []
var price: [String] = []
override func viewDidLoad()
{
super.viewDidLoad()
self.tableView.contentInset = UIEdgeInsetsMake( 20, 20 , 0, 0)
let priceProductDetails = tableViewModel.dataProvider()
for (key, value) in priceProductDetails
{
product.append(key)
price.append(value)
}
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return product.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: .Value1, reuseIdentifier: "UITableViewCell")
cell.textLabel?.text = product[indexPath.row]
cell.detailTextLabel?.text = price[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
print("You tapped cell number \(indexPath.row).")
}
}
サンプル表
#import "StartreserveViewController.h"
#import "CollectionViewController.h"
#import "TableViewCell1.h"
@interface StartreserveViewController ()
{
NSArray *name;
NSArray *images;
NSInteger selectindex;
}
@end
@implementation StartreserveViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor blueColor];
_startReservetable.backgroundColor = [UIColor blueColor];
name = [[NSArray alloc]initWithObjects:@"Mobiles",@"Costumes",@"Shoes",
nil];
images = [[NSArray
alloc]initWithObjects:@"mobilestitle.jpg",@"costumetitle.jpeg",
@"shoestitle.png",nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"tableview";
TableViewCell1 *cell =[tableView dequeueReusableCellWithIdentifier:cellId];
cell.cellTxt .text = [name objectAtIndex:indexPath.row];
cell.cellImg.image = [UIImage imageNamed:[images
objectAtIndex:indexPath.row]];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{
selectindex = indexPath.row;
[self performSegueWithIdentifier:@"second" sender:self];
}
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"second"])
{
CollectionViewController *obj = segue.destinationViewController;
obj.receivename = [name objectAtIndex:selectindex];
}
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
@end
.h
#import <UIKit/UIKit.h>
@interface StartreserveViewController :
UIViewController<UITableViewDelegate,UITableViewDataSource>
@property (strong, nonatomic) IBOutlet UITableView *startReservetable;
@end
vc.m
#import "ViewController.h"
@interface ViewController ()
{
NSArray *cityArray;
NSArray *citySubTitleArray;
NSArray *cityImage;
NSInteger selectindexpath;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
cityArray = [[NSArray
alloc]initWithObjects:@"Coimbatore",@"Salem",@"Chennai",nil];
citySubTitleArray = [[NSArray alloc]initWithObjects:@"1",@"2",@"3", nil];
cityImage = [[NSArray alloc]initWithObjects:@"12-300x272.png"
, @"380267_70d232fc33b44d4ebe7b42bbe63ee9be.png",@"Apple-logo_318
-40184.png", nil];
}
#pragma mark - UITableView Data Source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection
:(NSInteger)section
{
return cityImage.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"city";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil)
{
cell = [[UITableViewCell
alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId];
}
cell.textLabel.text = [cityArray objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [citySubTitleArray objectAtIndex:indexPath.row];
cell.imageView.image = [UIImage imageNamed:
[cityImage objectAtIndex:indexPath.row]];
// NSData *data = [[NSData alloc]initWithContentsOfURL:
[NSURL URLWithString:@""]];
// cell.imageView.image = [UIImage imageWithData:data];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath
: (NSIndexPath *)indexPath
{
NSLog(@"---- %@",[cityArray objectAtIndex:indexPath.row]);
NSLog(@"----- %@",[cityImage objectAtIndex:indexPath.row]);
selectindexpath=indexPath.row;
[self performSegueWithIdentifier:@"second" sender:self];
}
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little p
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if ([segue.identifier isEqualToString:@"second"])
{
secondViewController *object=segue.destinationViewController;
object.cityName=[cityArray objectAtIndex:selectindexpath];
object.cityImage=[cityImage objectAtIndex:selectindexpath];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
vc.m
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UITableViewDataSource
, UITableViewDelegate>
@property (strong, nonatomic) IBOutlet UITableView *cityLabelList;
@end
sv.m
#import <UIKit/UIKit.h>
@interface secondViewController : UIViewController
@property(strong, nonatomic) NSString *cityName;
@property(strong,nonatomic)NSString *cityImage;
@end
sv.h
#import "secondViewController.h"
@interface secondViewController ()
@property (strong, nonatomic) IBOutlet UILabel *lbl_desc;
@property (strong, nonatomic) IBOutlet UIImageView *img_city;
@end
@implementation secondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title=self.cityName;
if ([self.cityName isEqualToString:@"Coimbatore"])
{
self.lbl_desc.text=@"Coimbatore city";
self.img_city.image=[UIImage imageNamed:
[NSString stringWithFormat:@"%@",self.cityImage]];
}
else if ([self.cityName isEqualToString:@"Chennai"])
{
self.lbl_desc.text= @"Chennai City Gangstar";
self.img_city.image=[UIImage imageNamed:
[NSString stringWithFormat:@"%@",self.cityImage]];
}
else
{
self.lbl_desc.text= @"selam City";
self.img_city.image=[UIImage imageNamed:
[NSString stringWithFormat:@"%@",self.cityImage]];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"HistoryCell";
UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.descriptionLabel.text = @"Testing";
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Code for selection.
}
これらはUITableViewデリゲートメソッドです。