2013-04-06 2 views
41

У меня есть приложение в Xcode 4.6, в котором используются раскадровки. Я добавил UITableView в класс контроллера вида, который работал, как ожидалось. Однако, когда я попытался удалить UITableView в раскадровке и добавить его обратно в один класс программно, я столкнулся с двумя конкретными проблемами:Создание UITableView Programmatically

1) Хотя я установил тип UITableViewCell типа субтитров, метка детали больше не появляется.

2) Сегмент, который должен произойти при выборе ячейки, не возникает, и подготовка segue даже не вызывается, что указывает на то, что ни одно сообщение не отправляется в представление таблицы при выборе ячейки.

Вот соответствующий код:

@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.... 
    } 
} 

Я не уверен, что я забываю сделать так, чтобы я мог решить эти две проблемы. Любая помощь приветствуется.

+0

Try определить высоту ячейки. – iphonic

+0

не высота строки высота ячейки? у меня он установлен на 45, который должен быть более чем достаточно ... – jac300

+0

О да, это сработало бы, я думаю, что вы определили неправильный метод didDeselect, а должен быть сделанSelect. – iphonic

ответ

50

Когда вы регистрируете класс и используете 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; 
} 

Что касается Segue, это нельзя назвать, потому что вы не можете сделать переход к таблице, вы создали в коде, а не в IB. Опять же, вернитесь к старому и используйте tableView: didSelectRowAtIndexPath: который вызывается при выборе ячейки. Создайте свой контроллер детали там и выполните переход в коде.

После редактирования:

Я не видел добавленный вами код. Вы внедрили didDeselectRowAtIndexPath, а не didSelectRowAtIndexPath. Если вы измените это, ваш segue должен работать.

+0

Я думаю, вы можете использовать segue, если он существует в вашей доске объявлений, но вам все равно нужно реализовать 'tableView: didSelectRowAtIndexPath:' и выполнить программную программу segue, которая побеждает цель. – tapi

+0

@tapi, да, я знаю, я не видел некоторых ее кода и думал, что OP пытается сделать segue прямо из ячейки. – rdelmar

+0

Я просто попробовал добавить tableView: didSelectRowAtIndexPath: и в body performSegueWithIdentifier ... но это не работает. Угадайте, я попробую сделать переход в коде – jac300

16

Возможно, вы выполнили свои работы на 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 
5
- (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; 
} 
3
- (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; 
} 
0
- (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.

+0

Его лучше запомнить каждый раз –

-1
#import "ViewController.h" 

@interface ViewController() 

{ 

    NSMutableArray *name; 

} 

@end 


- (void)viewDidLoad 

{ 

    [super viewDidLoad]; 
    name=[[NSMutableArray alloc]init]; 
    [name addObject:@"ronak"]; 
    [name addObject:@"vibha"]; 
    [name addObject:@"shivani"]; 
    [name addObject:@"nidhi"]; 
    [name addObject:@"firdosh"]; 
    [name addObject:@"himani"]; 

    _tableview_outlet.delegate = self; 
    _tableview_outlet.dataSource = self; 

} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

{ 

return [name count]; 

} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 

    static NSString *simpleTableIdentifier = @"cell"; 

    UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 

    cell.textLabel.text = [name objectAtIndex:indexPath.row]; 
    return cell; 
} 
1

Создание таблицы с использованием tableViewController.

импорта UIKit

Класс 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).") 
} 

}

1

образец таблицы

#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. 
} 

прагма марка - UITableView Datasource

-(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 

#import <UIKit/UIKit.h> 

@interface StartreserveViewController :  
UIViewController<UITableViewDelegate,UITableViewDataSource>  
@property (strong, nonatomic) IBOutlet UITableView *startReservetable; 

@end 
+0

Как это отличается от 7 других ответов уже здесь? Когда вы даете ответ, предпочтительнее дать [какое-то объяснение в отношении ПОЧЕМУ ваш ответ] (http://stackoverflow.com/help/how-to-answer). –

1

vc.m

#import "ViewController.h" 

импорт "secondViewController.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"]) 
{ 


    [email protected]"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. 
} 
Смежные вопросы