|
|
|
[iOS] ผมทำแอพ Dictionary พบปัญหาขั้นตอนการ Search ข้อมูลที่ได้มาไม่ตรงกัน มีโค้ดด้านในครับ |
|
|
|
|
|
|
|
สวัสดีทุกท่านครับ
ผมกำลังทำแอพดิคชันนารี โดยใช้ SQLite เป็น Database น่ะครับ ลักษณะคร่าวๆคือ
มี MasterView : tableview ทำงานเป็น Navigation เวลาTAPบนคำศัพท์ มันจะ NAV ไปหน้า DetailView
ณ ตอนนี้ผมสามารถทำการค้นหาได้แล้วครับ แต่ปัญหาคือว่า
ตอนค้นหาน่ะ มันก็ตรงนะครับ แต่พอ TAP ปุ้บ ความหมายที่ได้มากลับกลายเป็น ความหมายแรกที่ปรากฏใน TableView น่ะครับ และหากค้นหาเจอ 2 คำ พอ TAP บรรทัดที่ 2 มันก็จะเป็นความหมายของคำที่ 2 ใน TableView เดิมน่ะครับ
Code (Objective-C)
//
// MasterViewController1.m
// iTechDictionary
//
// Created by MITR RAIPUTTA on 27/2/2556.
// Copyright (c) พ.ศ. 2556 MITR2009. All rights reserved.
//
#import "MasterViewController1.h"
@interface MasterViewController1 ()
@end
@implementation MasterViewController1
@synthesize words,detail,filteredwords;
-(NSArray*) filteredWordsForSearchScope:(NSUInteger)scopeID
{
NSPredicate *predicate;
NSString *searchString = self.searchDisplayController.searchBar.text;
switch (scopeID) {
case 0:
predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@",searchString];
break;
case 1:
predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchString];
break;
default:
break;
}
return [self.words filteredArrayUsingPredicate:predicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
NSInteger scopeID = controller.searchBar.selectedScopeButtonIndex;
self.filteredwords = [self filteredWordsForSearchScope:scopeID];
return YES;
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
self.filteredwords = [self filteredWordsForSearchScope:searchOption];
return YES;
}
-(NSArray *)arrayForTableView:(UITableView *)tableView
{
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return self.filteredwords;
}else{
return self.words;
}
}
-(NSString *)filePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"DICTIONARY.db"];
}
-(void)openDB
{
if (sqlite3_open([[self filePath] UTF8String],&db) != SQLITE_OK)
{
sqlite3_close(db);
NSAssert(0,@"Database failed to open");
}else{
NSLog(@"database opend");
}
}
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
self.title = @"iTech General Programmer";
words = [[NSMutableArray alloc]init];
detail = [[NSMutableArray alloc]init];
[self openDB];
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM generals"];
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(db, [sql UTF8String], -1 , &statement, nil) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW) {
char *field1 = (char *) sqlite3_column_text(statement, 1);
NSString *field1Str = [[NSString alloc]initWithUTF8String:field1];
char *field2 = (char *) sqlite3_column_text(statement, 2);
NSString *field2Str = [[NSString alloc]initWithUTF8String:field2];
NSString *str = [[NSString alloc]initWithFormat:@"%@", field1Str];
NSString *str1 = [[NSString alloc]initWithFormat:@"%@",field2Str];
[words addObject:str];
[detail addObject:str1];
}
}
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[self arrayForTableView:tableView]count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = [[self arrayForTableView:tableView] objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController1 *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController1"];
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
if([self.searchDisplayController isActive])
{
path = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
detailViewController.wordDetail = [self.filteredwords objectAtIndex:path.row];
detailViewController.detailDetail = [self.detail objectAtIndex:indexPath.row];
มันน่าจะผิดแถวๆบรรทัดนี้น่ะครับ แต่ผมไปต่อไม่ถูกแล้ว หรือจะให้เปลี่ยนทิศทางโค้ดก็ได้ครับ ขอแค่มันถูกก็พอ
}else{
detailViewController.wordDetail = [words objectAtIndex:indexPath.row];
detailViewController.detailDetail = [detail objectAtIndex:path.row];
}
[self.navigationController pushViewController:detailViewController animated:YES];
}
@end
Tag : Mobile, iOS, iPhone, Objective-C
|
|
|
|
|
|
Date :
2013-02-28 07:16:27 |
By :
mitr2009 |
View :
1418 |
Reply :
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มันติดตรงช่วงประมาณบรรทัดที่ 177 อะครับ ผมไปต่อไม่ถูกแล้ว
TAP คำศัพท์โดยไม่พึ่ง UISearchDisplayController ไม่มีปัญหาครับ แสดงผลลัพท์ได้ถูกต้อง แต่พอใช้เจ้าเสิร์ทเท่านั้นแหละ ป่วนเลย
ขอไอเดียหน่อยครับ
|
|
|
|
|
Date :
2013-02-28 07:21:01 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมอาศัย UILabel ในการแสดงความหมายของศัพท์ในหน้า DetailView นะครับ
|
|
|
|
|
Date :
2013-02-28 07:22:15 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลอง Capture หน้าจอมาให้ผมดูหน่อยครับ
|
|
|
|
|
Date :
2013-02-28 09:56:19 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date :
2013-02-28 16:58:49 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ครับผม
|
|
|
|
|
Date :
2013-02-28 17:01:40 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date :
2013-02-28 17:03:34 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ต้องการโค้ดแบบเต็มๆไหมครับ เด่วโพสให้
|
|
|
|
|
Date :
2013-03-01 14:41:42 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
รู้สึกว่า Core Data จะตอบสนอง App นี้ได้ดีกว่านะครับ คงต้องศึกษาใหม่แล้ว จะทันไหมว๊าอีก 7 วัน พระเจ้า !!
|
|
|
|
|
Date :
2013-03-01 18:21:03 |
By :
mitr2009 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 00
|