【问题标题】:Call the method of MainViewController from inside ViewController didselectrowatindexpath Objective c从 ViewController didselectrowatindexpath Objective c 内部调用 MainViewController 的方法
【发布时间】:2017-06-01 01:51:48
【问题描述】:

`

"BeneficieryListViewController.h"
    @protocol BeneficieryListViewControllerDelegate <NSObject>
    -(void)shiftTabLocation:(CGFloat)tabValue;
    @end

    @interface BeneficieriesListViewController : UIViewController
    @property (weak, nonatomic) id<BeneficieryListViewControllerDelegate> myDelegate;
    @end

"BeneficieryListViewController.m"
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(self.myDelegate && [self.myDelegate respondsToSelector:@selector(shiftTabLocation:)])
        {
            [self.myDelegate shiftTabLocation:2.0];
        }
  }
"MainViewController.m"      
    -(void)shiftTabLocation:(CGFloat)tabValue
    {
        BeneficieriesListViewController *bvc = [[BeneficieriesListViewController alloc] init];
        bvc.myDelegate = self;

        [self selectTabAtIndex:tabValue didSwipe:YES];
    }

`我必须创建水平滚动 UIViewControllers 包含 4 个选项卡,并且在每个选项卡的选择上应该显示不同的 UIView。为此,我使用库并创建了一个 UIViewController 作为该库“ViewPagerController”的子类。而且,我创建了一个 NSMutableArray,其中包含 4 个 UIViewControllers,我在每个选项卡的选择中将它们作为 UIView 传递。

一个 UIViewController 有 UITableView,我现在要做的是 - 在选择 UITableViewCell(在第一个 UIViewController 内)时,标签栏应该改变它的位置并根据条件转移到另一个标签。

我尝试使用委托来调用主视图控制器的方法,但它不起作用,我也尝试直接指定主视图控制器的对象并调用它的方法,但它不起作用。

请帮我解决这个问题,我被困了很多天。 提前感谢您查看问题。

【问题讨论】:

  • 请在主类中展示tableview、delegate和delegate listener的代码。
  • 是的,我连同代码一起更新了它。

标签: ios objective-c iphone uitableview uiviewcontroller


【解决方案1】:

您在 BeneficieriesListViewController 函数中设置 BeneficieriesListViewController 的委托,该委托由委托调用。因此它不起作用。将 MainViewController 中的以下代码移至 viewDidLoad 或 viewDidAppear 方法

MainViewController.m

-(void)viewDidLoad
{

BeneficieriesListViewController *bvc = [[BeneficieriesListViewController alloc] init];
    bvc.myDelegate = self;
}

它会起作用的。现在 shiftTabLocation 函数会是这样的

-(void)shiftTabLocation:(CGFloat)tabValue
{
    [self selectTabAtIndex:tabValue didSwipe:YES];
}

【讨论】:

  • 我在 BeneficieryListViewController.h 中创建了委托方法并在 MainViewController 中调用它。
  • 做了但还是不行,没有调用委托方法。
  • 尝试不使用 if 条件并告诉我结果。
  • 感谢#Fawad,我尝试了同样的方法,但仍然无法正常工作。实际上 MainViewController 类是 ViewPagerController 的子类,是它没有调用委托方法的问题吗?
  • @ReetaChainani 如果 ViewPagerController 是 UIViewController 的子类,它应该可以工作。我已经测试了代码并且它正在工作。
【解决方案2】:

我无法了解 shiftTabLocation 方法中发生的情况。您在这里创建未使用的 BeneficieriesListViewController 对象的原因是什么?

在您调用 BeneficieryListViewControllerDelegate 方法时,委托对象是否存在?

如果是这样,您将面临以下两种情况之一:

  1. 按预期调用的方法
  2. 应用程序崩溃,因为委托对象类未实现此委托方法

如果调用时委托属性为 nil,请尝试查找您创建 BeneficieriesListViewController 对象及其委托属性的位置。不要忘记您的委托属性很弱,它会在失去最后一个强链接的那一刻解除分配。

【讨论】:

  • 感谢您查看代码。实际上,问题是,它没有调用委托方法,我的意思是它没有进入 if 条件(在 BeneficieryListViewController.m 中)我不知道它为什么会发生。我之前曾与代表合作过,这很好,我也对这个 VC 做了同样的事情,但它不会在 if 条件下进入。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2014-06-20
  • 2014-03-22
相关资源
最近更新 更多