Как мне получить TTTableViewDataSource для работы с AddressBook - PullRequest
0 голосов
/ 26 октября 2010

Я хотел бы получить TTPickerTextField для поиска и получения данных из сборки в AddressBook, и я понимаю, что должен создать свой собственный класс источника данных, который реализует протокол TTTableViewDataSource. Но как мне его реализовать, чтобы он правильно соединялся со сборкой в ​​AddressBook? Я новичок, поэтому объединение Руководства по программированию адресной книги для iOS и API для TTTableViewDataSource меня очень смущает, поэтому, пожалуйста, помогите с некоторыми советами или даже примерами.

Спасибо

1 Ответ

1 голос
/ 02 ноября 2010

Вот ABDataSource, который делает именно это.Я использую это в одном из моих приложений.Он не будет работать сразу после установки, потому что это зависит от моего класса DSMEmailAddress, но я надеюсь, что он укажет вам правильное направление.

Вы можете использовать этот код в соответствии с условиями лицензии zlib.

@interface ABDataSource : TTListDataSource {
    ABAddressBookRef _addressBookRef;
    NSMutableArray* _allItems;
    NSMutableArray* _delegates;
}

+ (ABDataSource*)abDataSource:(BOOL)forSearch;

@end

@implementation ABDataSource


+ (ABDataSource*)abDataSource:(BOOL)forSearch {
    ABDataSource* dataSource =  [[[ABDataSource alloc] init] autorelease];

    return dataSource;
}

///////////////////////////////////////////////////////////////////////////////////////////////////


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

///////////////////////////////////////////////////////////////////////////////////////////////////
// UITableViewDataSource

- (NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView {
    return nil;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// TTTableViewDataSource

- (NSString*)tableView:(UITableView*)tableView labelForObject:(id)object {
    DSMEmailAdress* field = object;
    return field.name;
}

- (Class)tableView:(UITableView*)tableView cellClassForObject:(id)object {
    return [DSMEmailAddressTableCell class];
}

- (void)tableView:(UITableView*)tableView prepareCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath {
    cell.accessoryType = UITableViewCellAccessoryNone;

    ((TTTableViewCell*)cell).object =[_items objectAtIndex:indexPath.row];
}

- (void)search:(NSString*)text {

    if (nil == _allItems) {
        _addressBookRef = ABAddressBookCreate ();
        NSArray* allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(_addressBookRef);
        _allItems = [[NSMutableArray alloc] initWithCapacity:[allPeople count]]; // capacity is only a rough guess, but better than nothing
        for (id record in allPeople) {
            CFTypeRef emailProperty = ABRecordCopyValue((ABRecordRef)record, kABPersonEmailProperty);
            NSArray *emails = (NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty);
            CFRelease(emailProperty);
            for (NSString *email in emails) {
                NSString* compositeName = (NSString *)ABRecordCopyCompositeName((ABRecordRef)record);
                DSMEmailAdress* field = [[[DSMEmailAdress alloc] initWithName:compositeName mail:email] autorelease];
                [compositeName release];
                [_allItems addObject:field];
            }
            [emails release];
        }
        CFRelease(_addressBookRef);
        _addressBookRef = nil;
        [allPeople release];
        allPeople = nil;
    }


    [_items release];

    if (text.length) {
        _items = [[NSMutableArray alloc] init];

        for (DSMEmailAdress* mail in _allItems) {
            if ([mail hasPrefix:text]) {
                [_items addObject:mail];
            }
        }


        if ([_items count]==0){
            [_items release];
            _items = nil;
        }
    } else {
        _items = nil;
    }

    [_delegates perform:@selector(modelDidFinishLoad:) withObject:self];
}

#pragma mark TTModel

- (NSMutableArray*)delegates {
    if (!_delegates) {
        _delegates = TTCreateNonRetainingArray();
    }
    return _delegates;
}

- (BOOL)isLoadingMore {
    return NO;
}

- (BOOL)isOutdated {
    return NO;
}

- (BOOL)isLoaded {
    return !!_allItems;
}

- (BOOL)isLoading {
    return NO;
}

- (BOOL)isEmpty {
    return !_items.count;
}

- (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more {
}

- (void)invalidate:(BOOL)erase {
}

- (void)cancel {
    [_delegates perform:@selector(modelDidCancelLoad:) withObject:self];
}

@end
...