I’m new to iOS development and I’m trying to build a dictionary. My first screen just has a search bar on top and a TableView of all the entries underneath. When you type in the search bar, the TableView is filtered with the entries that match. When you click on any of the cells either in list-all mode or filtered mode, another view is pushed showing the name of the word and the definition.
I am already able to open a new screen whenever I click on the table cells, but for some reason, the two labels in the new screen (the word and the definition) just won’t be updated with the selection–it stays empty. I think I’ve correctly set up these two IBOutlets in my XIB file though, because when I log the text attributes of the UILabels, they print out correctly. Help?
EntryViewController.h (the second screen):
#import <UIKit/UIKit.h>
@interface EntryViewController : UIViewController
@property (nonatomic, strong) IBOutlet UILabel *word;
@property (nonatomic, strong) IBOutlet UILabel *definition;
@end
EntryViewController.m:
#import "EntryViewController.h"
@implementation EntryViewController
@synthesize word, definition;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
self.word = [[UILabel alloc] init];
self.definition = [[UILabel alloc] init];
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:NO];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
UTVTViewController.h (the first screen):
#import <UIKit/UIKit.h>
#import "EntryViewController.h"
@interface UTVTViewController : UIViewController <UITableViewDataSource, UITableViewDelegate,
UISearchBarDelegate, UISearchDisplayDelegate>
@property (nonatomic, strong) IBOutlet UITableView *sampleTableView;
@property (nonatomic, strong) NSMutableDictionary *entries;
@property (nonatomic, strong) NSMutableArray *sortedWords, *filteredList;
@property (nonatomic) BOOL isSearching;
@property (nonatomic, retain) EntryViewController *entryView;
- (void)filterListForSearchText:(NSString *)searchText;
@end
UTVTViewController.m
#import "UTVTViewController.h"
#import "EntryViewController.h"
@implementation UTVTViewController
@synthesize sampleTableView, entries, sortedWords, filteredList, isSearching, entryView;
- (void)viewDidLoad {
[super viewDidLoad];
entries = [NSMutableDictionary new];
[entries setObject:@"a syndrome of wide spaced eyes (ocular hypertelorism), front-facing (anteverted) nostrils, a broad upper lip, a malformed (\"saddle-bag\") scrotum, and laxity of the ligaments resulting in bending back of the knees (genu recurvatum), flat feet, and overly extensible fingers. There are X-linked and autosomal forms of the disease. The gene for the X-linked form has been mapped to chromosome band Xp11.21 and identified as the FGD1 gene." forKey:@"aarskog-scott syndrome"];
[entries setObject:@"a diminution, decrease or easing. In medicine there may be abatement of pain or any other symptom or sign. In the environment there may abatement in the degree of pollution" forKey:@"abatement"];
[entries setObject:@"a disorder marked by a pathological pattern of alcohol use that causes serious impairment in social or occupational functioning. It includes both alcohol abuse and alcohol dependence." forKey:@"alcoholism"];
// ...other words
sortedWords = [[NSMutableArray alloc] initWithArray:[[entries allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];
filteredList = [[NSMutableArray alloc] init];
isSearching = NO;
}
// ...
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *selection;
if (isSearching && [filteredList count]) {
selection = [filteredList objectAtIndex:indexPath.row];
} else {
selection = [sortedWords objectAtIndex:indexPath.row];
}
EntryViewController *evc = [[EntryViewController alloc] initWithNibName:@"EntryView" bundle:nil];
evc.title = selection;
[evc.word setText:selection];
[evc.definition setText:[entries objectForKey:selection]];
NSLog(@"word=%@", evc.word.text);
NSLog(@"definition=%@", evc.definition.text);
[[self navigationController] pushViewController:evc animated:YES];
}
@end
EDIT: I’m including the header and implementation files for the AppDelegate. I have a feeling the error is somewhere in the navigationController which I have currently not connected to anything, but I don’t even know where to attach it since I don’t have one in my XIB.
UTVTAppDelegate.h:
@interface UTVTAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UTVTViewController *viewController;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end
UTVTAppDelegate.m
@implementation UTVTAppDelegate
@synthesize navigationController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[UTVTViewController alloc] initWithNibName:@"UTVTViewController" bundle:nil];
self.window.rootViewController = self.viewController;
navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
[navigationController setNavigationBarHidden:YES];
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
// default Xcode methods
@end
In the
didSelectRowAtIndexPathmethod, I was setting theUILabel‘s texts before pushing the view controller to the navigation controller. Solution:I also removed the lines in my code where I called
allocon detachedUILabelobjects.