【问题标题】:ABPeoplePickerNavigationController in Tabbar based application基于 Tabbar 的应用程序中的 ABPeoplePickerNavigationController
【发布时间】:2013-12-10 23:41:49
【问题描述】:

我有如下要求,例如在基于标签栏的应用程序中显示 ABPeoplePickerNavigationController。我在网上研究了很多,没有找到有用的答案,但一个here,实现如下代码将有助于在标签栏中获取 ABPeoplePickerNavigationController,如图所示。

第一个屏幕截图是我运行应用程序时的直接结果,第二个屏幕截图是我再次单击“联系人”选项卡时的结果(很奇怪,但那是真的)。​​

-(void)awakeFromNib
{
    ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init];   
    NSMutableArray *newControllers = [NSMutableArray arrayWithArray: [self.tabBarController viewControllers]];
    int index = [newControllers indexOfObject: self];  
    [newControllers replaceObjectAtIndex: index withObject: nav];
    [self.tabBarController setViewControllers: newControllers animated: NO];
    [nav release];
}

现在我的问题是我能够浏览联系人但无法设置 ABPeoplePickerNavigationController 委托。我想重写以下委托方法

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
}

-(BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
}

我无法设置,因为我不知道在哪里设置委托。请帮助我,因为我的项目在截止日期之前并且所有其他功能都已完成。

欢迎任何技巧。我假设我可以继承 ABPeoplePickerNavigationController 并做一些事情,但不知道该怎么做。

编辑 设置委托后,当我单击“联系人”选项卡时出现以下崩溃。

#0  0x00f85057 in ___forwarding___
#1  0x00f84f22 in __forwarding_prep_0___
#2  0x00d4b678 in -[ABMembersViewController membersController:shouldAllowSelectingPerson:]
#3  0x00d1df85 in -[ABMembersController abDataSource:shouldAllowSelectingPerson:]
#4  0x00d9abb9 in -[ABMembersDataSource tableView:cellForRowAtIndexPath:]
#5  0x003357fa in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:]
#6  0x0032b77f in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:]
#7  0x00340450 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:]
#8  0x00338538 in -[UITableView layoutSubviews]
#9  0x01dc8451 in -[CALayer layoutSublayers]
#10 0x01dc817c in CALayerLayoutIfNeeded
#11 0x01dc137c in CA::Context::commit_transaction
#12 0x01dc10d0 in CA::Transaction::commit
#13 0x01df17d5 in CA::Transaction::observer_callback
#14 0x00ff4fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
#15 0x00f8a0e7 in __CFRunLoopDoObservers
#16 0x00f52bd7 in __CFRunLoopRun
#17 0x00f52240 in CFRunLoopRunSpecific
#18 0x00f52161 in CFRunLoopRunInMode
#19 0x018b5268 in GSEventRunModal
#20 0x018b532d in GSEventRun
#21 0x002d042e in UIApplicationMain
#22 0x00002240 in main at main.m:13

【问题讨论】:

    标签: iphone ipad addressbook


    【解决方案1】:

    在 awakeFromNib 中创建 ABPeoplePickerNavigationController 后,您需要设置它的委托。添加这一行:

    nav.peoplePickerDelegate = self;
    

    这会将您的自定义视图控制器设置为人员选择器的委托。您的控制器需要实现 ABPeoplePickerNavigationControllerDelegate 协议,并且您需要实现您在问题中列出的两种方法。

    【讨论】:

    • 萨克斯。我实现为 nav.peoplePickerDelegate = self;但我在这个问题stackoverflow.com/questions/7068848/… 中崩溃了应用程序
    • 如果我不设置委托工作正常但委托方法没有被调用,因为它没有设置。
    【解决方案2】:

    您是否尝试过像这样设置nav.peoplePickerDelegate = self;

    -(void)awakeFromNib
    {
        ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init];   
        nav.peoplePickerDelegate = self;
        NSMutableArray *newControllers = [NSMutableArray arrayWithArray: [self.tabBarController viewControllers]];
        int index = [newControllers indexOfObject: self];  
        [newControllers replaceObjectAtIndex: index withObject: nav];
        [self.tabBarController setViewControllers: newControllers animated: NO];
        [nav release];
    }
    

    在您的@interface 中,您可以使用ABPeoplePickerNavigationControllerDelegate 表明您是代表:

    @interface MyCustomViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
    
        // ....
    }
    

    【讨论】:

    • 萨克斯。我实现为 nav.peoplePickerDelegate = self;但我在这个问题stackoverflow.com/questions/7068848/… 中崩溃了应用程序
    • 如果我不设置委托工作正常但委托方法没有被调用,因为它没有设置。
    【解决方案3】:

    最后,我们决定在应用程序委托中使用选择器控制器,并仅通过从视图控制器的 tabBarController 数组中获取视图控制器来设置其委托。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多