2013-04-06 24 views
41

Ho un'applicazione in Xcode 4.6 che utilizza gli storyboard. Ho aggiunto un UITableView a una classe di controller di visualizzazione, che ha funzionato come previsto. Tuttavia, quando ho provato a cancellare l'UITableView nello storyboard e l'aggiunta di nuovo nella stessa classe di programmazione, ho incontrato due problemi specifici:Creazione di UITableView a livello di programmazione

1) Anche se ho impostato il tipo UITableViewCell essere di tipo sottotitolo, l'etichetta dettaglio non appare più.

2) Il passaggio che deve verificarsi quando si seleziona una cella non si verifica e non viene neppure chiamato il seguito, a indicare che nessun messaggio viene inviato alla vista tabella quando viene selezionata una cella.

Ecco il codice rilevante:

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

io non sono sicuro di quello che sto dimenticando di fare in modo che possa risolvere questi due problemi. Qualsiasi aiuto è apprezzato.

+0

cercare di definire l'altezza della cella. – iphonic

+0

non è l'altezza della riga l'altezza della cella? lo ho impostato a 45 che dovrebbe essere più che sufficiente spazio ... – jac300

+0

Oh sì, avrebbe funzionato, penso che tu abbia definito un metodo sbagliato, invece di disegnarlo dovrebbe essere fatto selezionare. – iphonic

risposta

50

Quando si registra una classe e si utilizza dequeueReusableCellWithIdentifier: forIndexPath:, il metodo dequeue è garantito per restituire una cella, pertanto la clausola if (cell == nil) non viene mai inserita. Quindi, basta farlo alla vecchia maniera, non registrare la classe, e utilizzare 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; 
} 

Per quanto riguarda la segue, non può essere chiamato perché non è possibile effettuare un segue a una tabella che hai creato nel codice, non in IB. Di nuovo, torna alla vecchia maniera e usa tableView: didSelectRowAtIndexPath: che verrà chiamato quando selezioni una cella. Crea un'istanza del tuo controller dei dettagli e fai la trascrizione nel codice.

Dopo edit:

non ho visto il codice ivi aggiunti. Hai implementato didDeselectRowAtIndexPath piuttosto che didelectRowAtIndexPath. Se lo cambi, i tuoi passi dovrebbero funzionare.

+0

Penso che tu possa usare il seguito se esiste nella tua story board, ma avresti ancora bisogno di implementare 'tableView: didSelectRowAtIndexPath:' ed esegui il seguente programma che sconfigge lo scopo. – tapi

+0

@tapi, sì, lo so, non ho visto un po 'del suo codice, e ho pensato che l'OP stava cercando di rendere il seguito direttamente da una cella. – rdelmar

+0

Ho appena provato ad aggiungere tableView: didSelectRowAtIndexPath: e nel corpo performSegueWithIdentifier ... ma questo non funziona. Credo che proverò a fare la transizione nel codice – jac300

16

Si potrebbe fare che funziona al 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. 
} 

questi sono UITableView metodi delegato.

+0

È meglio essere ricordati ogni volta –

-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

Creazione di una vista tabella utilizzando tableViewController.

importazione UIKit

classe 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

tabella di esempio

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

marchio pragma - UITableView Origine dati

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

Come è diverso dalle altre 7 risposte già qui? Quando si dà una risposta è preferibile dare [qualche spiegazione su PERCHÉ la risposta] (http://stackoverflow.com/help/how-to-answer) è quella giusta. –

1

vc.m

#import "ViewController.h" 

importazione "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. 
} 
Problemi correlati