views:

160

answers:

4

Update: It seems to be a problem with the scope of the "results." titleForHeaderInSection seems to be unaware of the "results" arrays content. Will post once I find a solution just in case anyone stumbles across this with the same problem.

How would I set each individual row in cellForRowAtIndexPath to the results of an array populated by a Fetch Request? (Fetch Request made when button is pressed.)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //  ... set up cell code here ...
    cell.textLabel.text = [results objectAtIndex:indexPath valueForKey:@"name"];

}

warning: 'NSArray' may not respond to '-objectAtIndexPath:'

Edit:

- (NSArray *)SearchDatabaseForText:(NSString *)passdTextToSearchFor{
    NSManagedObject *searchObj;
    XYZAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains [cd] %@", passdTextToSearchFor]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];   

    [request setSortDescriptors:sortDescriptors];
    [request setEntity: entity]; 
    [request setPredicate: predicate]; 

    NSError *error;

    results = [managedObjectContext executeFetchRequest:request error:&error];
//  NSLog(@"results %@", results);

    if([results count] == 0){
        NSLog(@"No results found");
        searchObj = nil;
        self.tempString = @"No results found.";
    }else{
        if ([[[results objectAtIndex:0] name] caseInsensitiveCompare:passdTextToSearchFor] == 0) {
            NSLog(@"results %@", [[results objectAtIndex:0] name]);
            searchObj = [results objectAtIndex:0];
        }else{
            NSLog(@"No results found");
            self.tempString = @"No results found.";
            searchObj = nil;
        }       
    }

    [tableView reloadData]; 

    [request release];
    [sortDescriptors release];

    return results;
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    textToSearchFor =  mySearchBar.text;
    results = [self SearchDatabaseForText:textToSearchFor];
    self.tempString = [myGlobalSearchObject valueForKey:@"name"];   
    NSLog(@"results count: %d", [results count]);
    NSLog(@"results 0: %@", [[results objectAtIndex:0] name]);
    NSLog(@"results 1: %@", [[results objectAtIndex:1] name]);
}
@end

Console prints:

2010-06-10 16:11:18.581 XYZApp[10140:207] results count: 2
2010-06-10 16:11:18.581 XYZApp[10140:207] results 0: BB Bugs
2010-06-10 16:11:18.582 XYZApp[10140:207] results 1: BB Annie
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

Edit 2:

BT:

#0  0x95a91edb in objc_msgSend ()
#1  0x03b1fe20 in ?? ()
#2  0x0043cd2a in -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] ()
#3  0x0043ca9e in -[UITableViewRowData invalidateAllSections] ()
#4  0x002fc82f in -[UITableView(_UITableViewPrivate) _updateRowData] ()
#5  0x002f7313 in -[UITableView noteNumberOfRowsChanged] ()
#6  0x00301500 in -[UITableView reloadData] ()
#7  0x00008623 in -[SearchViewController SearchDatabaseForText:] (self=0x3d16190, _cmd=0xf02b, passdTextToSearchFor=0x3b29630) 
#8  0x000086ad in -[SearchViewController searchBarSearchButtonClicked:] (self=0x3d16190, _cmd=0x16492cc, searchBar=0x3d2dc50)
#9  0x0047ac13 in -[UISearchBar(UISearchBarStatic) _searchFieldReturnPressed] ()
#10 0x0031094e in -[UIControl(Deprecated) sendAction:toTarget:forEvent:] ()
#11 0x00312f76 in -[UIControl(Internal) _sendActionsForEventMask:withEvent:] ()
#12 0x0032613b in -[UIFieldEditor webView:shouldInsertText:replacingDOMRange:givenAction:] ()
#13 0x01d5a72d in __invoking___ ()
#14 0x01d5a618 in -[NSInvocation invoke] ()
#15 0x0273fc0a in SendDelegateMessage ()
#16 0x033168bf in -[_WebSafeForwarder forwardInvocation:] ()
#17 0x01d7e6f4 in ___forwarding___ ()
#18 0x01d5a6c2 in __forwarding_prep_0___ ()
#19 0x03320fd4 in WebEditorClient::shouldInsertText ()
#20 0x0279dfed in WebCore::Editor::shouldInsertText ()
#21 0x027b67a5 in WebCore::Editor::insertParagraphSeparator ()
#22 0x0279d662 in WebCore::EventHandler::defaultTextInputEventHandler ()
#23 0x0276cee6 in WebCore::EventTargetNode::defaultEventHandler ()
#24 0x0276cb70 in WebCore::EventTargetNode::dispatchGenericEvent ()
#25 0x0276c611 in WebCore::EventTargetNode::dispatchEvent ()
#26 0x0279d327 in WebCore::EventHandler::handleTextInputEvent ()
#27 0x0279d229 in WebCore::Editor::insertText ()
#28 0x03320f4d in -[WebHTMLView(WebNSTextInputSupport) insertText:] ()
#29 0x0279d0b4 in -[WAKResponder tryToPerform:with:] ()
#30 0x03320a33 in -[WebView(WebViewEditingActions) _performResponderOperation:with:] ()
#31 0x03320990 in -[WebView(WebViewEditingActions) insertText:] ()
#32 0x00408231 in -[UIWebDocumentView insertText:] ()
#33 0x003ccd31 in -[UIKeyboardImpl acceptWord:firstDelete:addString:] ()
#34 0x003d2c8c in -[UIKeyboardImpl addInputString:fromVariantKey:] ()
#35 0x004d1a00 in -[UIKeyboardLayoutStar sendStringAction:forKey:] ()
#36 0x004d0285 in -[UIKeyboardLayoutStar handleHardwareKeyDownFromSimulator:] ()
#37 0x002b5bcb in -[UIApplication handleEvent:withNewEvent:] ()
#38 0x002b067f in -[UIApplication sendEvent:] ()
#39 0x002b7061 in _UIApplicationHandleEvent ()
#40 0x02542d59 in PurpleEventCallback ()
#41 0x01d55b80 in CFRunLoopRunSpecific ()
#42 0x01d54c48 in CFRunLoopRunInMode ()
#43 0x02541615 in GSEventRunModal ()
#44 0x025416da in GSEventRun ()
#45 0x002b7faf in UIApplicationMain ()
#46 0x00002578 in main (argc=1, argv=0xbfffef5c) at /Users/default/Documents/iPhone Projects/XYZApp/main.m:14

edit:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return[results count];
 }
+3  A: 

There's no method -objectAtIndex:valueForKey:. Do you mean

cell.textLabel.text = [[myArray objectAtIndex:indexPath.row] valueForKey:@"object"];
//                     ^                               ****^

?

To composite Objective-C method calls you need multiple brackets, as shown by the ^'s. Also, -objectAtIndex: only accepts an NSInteger, but indexPath is a NSIndexPath. To get the row from the index path, use the .row property, as shown by the *'s.


Edit:

You seems to confuse -numberOfSectionsInTableView: with -tableView:numberOfRowsInSection:. A table contains one or more sections, and each section contains many rows (table view cells).

Your table have only 1 section, so you should return 1, or just remove this method as 1 is the default. And implement -tableView:numberOfRowsInSection: as

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return [results count];
}
KennyTM
If I put that, my application crash's with “EXC_BAD_ACCESS”. This may be related to something else tho. Will post when I gather more information. Thank you for the help.
Oh Danny Boy
@Mr: Yeah you need to show how do you populate `myArray`.
KennyTM
Disclaimer on the name: co-worker changed it when away at my desk. Have to wait an entire month to change it to something normal. Code requested posted above.
Oh Danny Boy
@Mr: You could try to ask on meta (http://meta.stackoverflow.com/) if it's possible to revert your name.
KennyTM
@Mr: Try `... valueForKey:@"name"]` instead of `@"object"`.
KennyTM
It originally was name and that's what it remains in the code. I had changed it to be a bit more descriptive when I only had a snippet. Weird thing is, if I log results in cellForRowAtIndexPath, it crash's at that point. I think results may be null in cellForRowAtIndexPath. But the logs in searchBarSearchButtonClicked show the data I want. If it is indeed this scope problem, how would I fix such a thing?
Oh Danny Boy
@Mr: What does the console print?
KennyTM
KennyTM, please see above post for what console prints.
Oh Danny Boy
@Mr: Please type `bt` after that `(gdb) `.
KennyTM
@Mr: Check your `-numberOfSectionsInTableView:`???
KennyTM
numberOfSectionsInTableView posted above.
Oh Danny Boy
@Mr: See update.
KennyTM
@KennyTM I followed your suggestion and the application still crashes with the same error. Also, the console prints the correct values, but does not display the data in the cells. I believe the problem is in cellForRowAtIndexPath concerning the "results" array. The appropriate solution seems less clear as I can think of no other way to display the data into each cell.
Oh Danny Boy
+1  A: 

I think your syntax is wrong. Shouldn't it be:

cell.textLabel.text = [[myArray objectAtIndex:indexPath] valueForKey:@"object"];
Philippe Leybaert
**indexPath.row** - common mistake. `objectAtIndex` is really confusing for new developers, as the function practically says "Give me an indexPath, and I'll give you an object".
Emil
A: 

I found the same debugger messages in my own code and the problem was the following:

- (void)viewDidLoad {
    [super viewDidLoad];
    products = [NSArray arrayWithObjects:@"", @"", nil];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return [products count];
}

It is weird but, when I use the method count, the app crashed and everything was solved after doing this:

@interface theCleass:NSObject {
       NSInteger    theSections;
}
@end

...

- (void)viewDidLoad {
    [super viewDidLoad];
    products = [NSArray arrayWithObjects:@"", @"", nil];

    theSections = [products count];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

        return theSections;
 }

Just by getting the number of elements inside viewDidLoad, though I don't know yet why is this happening because I was able to use count method in numberOfSections: in earlier projects.

iPhoneDevProf
My guess is that you were not retaining products. `arrayWithObjects` returns an autorelease object... so by the time you get into `numberOfSectionsInTableView`, products may have been released.
livingtech
A: 

It's because

products = [NSArray arrayWithObjects:@"", @"", nil];

is autoreleased object with retainCount == 1, so when you call return [products count], the count property is a property of an already freed object, so you can't do this.

Suggestion is not to do autoreleased objects

products = [[NSArray alloc] initWithObjects:@"", @"", nil];

and also

-(void)dealloc
{
[products release];
[super dealloc];
}

so products object will be destroyed when controller will be pop-uped

Dmitry