简体   繁体   中英

UITableViewCell from a custom .XIB file doesn't create outlets

Update 2:


Long story short, I was being silly (and, in my defense, not properly educated) about this. It works now. My questions have derailed from the original topic a little bit, but that's because I wasn't understanding what was going on in my application. I would like to close the question with one last (and small) query:

I've got two labels in my customCell.xib. I want one of them ( cell.label2 ) to sometimes contain a longer segment of text (2-3 lines). I know one way to make it all fit is to set the autoshrink property, but that shrinks to the text so it can fit on a single line. I want to preserve the original text size and expand the cell's height instead, making the text span multiple lines instead of shrinking it.

Is there a way to do this?

Update 1:


I tried a few things based on the replies below, and they got me nowhere. I am growing convinced that I am doing something fundamentally wrong, and you guys just can't think of it because it's so basic. So let's try again. I am going to changed the names a little, so they are easier to remember.

The problem seems to be in the fact that I can't create any IBOutlets or IBActions for my customCell. Right now I have 3 files that should handle this (DetailedDirectionViewCell.{h,m,xib}, but the Interface Builder doesn't allow me to create a property/outlet/reference out of my UITableViewCell object - anywhere.

Instead of copying the code here, I've provided a PasteBin entry with links to my code. As before, I've removed the less interesting methods. Take a look if you will. http://pastebin.com/p4eADhKQ

I also have customCell.{h,m}, but those are just new Objective C class files that inherit from UITableViewCell . customCell.xib is just a cell with two labels.


So I have a couple of problems really.

First, generating a UITableView programmatically, using a custom UITableViewCell contained in a .XIB file of its own. My DirectionsViewController class is just a UITableView with programmatic cells. Tapping on one of the cells needs to present a DetailedDirectionsViewController table (in a modal way), the cell design for which sits in a DetailedDirectionsViewCell.xib file. The problem is, I can't create an IBOutlet for the UITableViewCell from the nib file - anywhere. Dragging the File's Owner icon/outlet doesn't offer to create anything. Which, after 5 hours of struggling, means that I can't present my detailed view.

The second problem involves adding a navigation bar to the DirectionsViewController, but let's leave that alone for now.

Here are some methods you might find helpful:

//inside DirectionsViewController
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)
{
    DetailedDirectionsViewController *vc = [[DetailedDirectionsViewController alloc] initWithStyle:UITableViewStyleGrouped];
    vc.instruction = [turnList objectAtIndexPath:indexPath.row];
    [self.tabBarController presentModalViewController:vc animated:YES];
}

//inside DetailedDirectionsViewController
- (UITableViewCell *) tableView:(UITableView *) cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"directionsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        [[NSBundle mainBundle] initWIthNibNamed:@"DetailedDirectionsViewCell" owner:nil options:nil];
        cell = self.tableViewCell;
        self.tableViewCell = nil;
    }

    //here I configure the custom cell
    return cell;
}

I don't think the rest of the methods are of interest, because they are either working as expected, or are pretty much the default ones.

To sum up:

DirectionsViewController - essentially a UITableViewController with custom cells. No .xib file DetailedDirectionsViewController - detailed information about the entries from DirectionsViewController. Cells here should come from a .XIB file, but that's broken. DetailedDirectionsViewCell - this is the custom cell. I can't set its File's Owner.


Ok.. You do not create IBOutlet connection from File's Owner. Have a look at a screenshot. You create IBOutlet from CustomCell's view(with Red Arrow).

Looking after your code just follow these steps.

1) Goto CustomCell.h file. As you are saying customCell.xib has two UILabel s(assume label1 & label2 ) you gonna have to declare properties and create outlets in CustomCell.h file and in .m file synthesize and release it. Refer this code screen of mine.

在此输入图像描述

2) Now in CustomCell.xib , select view of CustomCell not File's Owner(File's Owner should inherit from NSObject only) go to Identity Inspector(Marked with Red Ellipse) and select the corresponding Customcell class (marked with Red rectangle).

3) Right click your customcell's view and make connections to labels. And save it..

在此输入图像描述

4) In your DirectionsViewController.m you have this UITableView's delegate method cellForRowAtIndexPath . Change it like this :

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *CustomCellIdentifier = @"CustomCell";
EditProjectCustomCell *cell = (EditProjectCustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; // typecast to customcell

[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

if (cell == nil)
{ 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EditProjectCustomCell" owner:self options:nil];

        for (id oneObject in nib) 
            if ([oneObject isKindOfClass:[EditProjectCustomCell class]])

            cell = (EditProjectCustomCell *)oneObject;

        [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

}

cell.label1.text=[someArray1 ObjectAtIndexPath: indexPath.row];
cell.label2.text=[someArray2 ObjectAtIndexPath: indexPath.row];

return cell;

}

this delegate method is gonna be called as many times as you returned value in numberOfRowsInSection DataSource method. Every time cell.label will be blank and you will add data to label by calling this line. so no need to create label each time as you did between line 79-90 here. http://pastebin.com/Vd4PKjTu

 cell.label1.text=[someArray ObjectAtIndexPath: indexPath.row];

Creating custom cell means you create UI(ie .xib),interface & implementation (.h,.m file) for UITableViewCell by yourself and adopt them in your class's (ie DirectionsViewController.m ) cellForRowAtIndexPath delegate method.

To load a custom cell, I've used this code (test it and it's working)

static NSString *CustomCellIdentifier = @"CustomCommentIdentifier";
detailedDirectionsViewCell *cell = (DetailedDirectionsViewCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DetailedDirectionsViewCell" owner:self options:nil];
    for (id oneObject in nib)
        {
             if ([oneObject isKindOfClass:[DetailedDirectionsViewCell class]])
             {
                  cell = (DetailedDirectionsViewCell *)oneObject;
             }
        }
}

and make sure that you changed the cell class nib file as the following:

  1. Click on the files owner, change the type of it to NSObject (this for not to confuse when connect the Outlets.
  2. Remove any view you have in the nib file, then, drag and drop a UITableViewCell component.
  3. Change the super class of the component to the Cell class, in your case, change the cell from UITableViewCell to DetailedDirectionsViewCell .
  4. Connect the outlet.

This should work, let me know if you have any question.

To answer your last question in Update 2, did you consider using a text field instead of a label? You should be able to disable editing so the user can't change what is displayed. If you need it to be a label, in the Attributes Inspector for the label, there is a property called "Lines" under the "Label" drop down that you can adjust. I'm not sure how to access that property programmaticly, but a quick Google search should help you out there.

In my case I had two different views for one cell class. And when I connected outlets to .h file they were connected only to the first view representation, not the second. So to ensure that your outlets are really connected go Xcode me menu and open View -> Utilities -> Show FileConnection inspector, then make sure that your view's outlets are really connected.

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM