Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 试图将UIActivityIndicatorView添加到视图中,但不起作用_Objective C_Ios - Fatal编程技术网

Objective c 试图将UIActivityIndicatorView添加到视图中,但不起作用

Objective c 试图将UIActivityIndicatorView添加到视图中,但不起作用,objective-c,ios,Objective C,Ios,我使用的是iOS Recipes PragProg书中的一个配方,下面是我使用的原始代码部分: - (void)addActivityIndicatorView { activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; activityIndicatorView.autores

我使用的是iOS Recipes PragProg书中的一个配方,下面是我使用的原始代码部分:

- (void)addActivityIndicatorView {

    activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleRightMargin |
    UIViewAutoresizingFlexibleBottomMargin |
    UIViewAutoresizingFlexibleLeftMargin;                       
    CGRect aiFrame = activityIndicatorView.frame;
    CGFloat originX = (self.view.bounds.size.width - aiFrame.size.width) / 2;
    CGFloat originY = (self.view.bounds.size.height - aiFrame.size.height) / 2;
    aiFrame.origin.x = floorl(originX);
    aiFrame.origin.y = floorl(originY);
    activityIndicatorView.frame = aiFrame;
    [self.view addSubview:activityIndicatorView];
}
我意识到我想要这个activityindicator代码用于通过web加载数据的其他控件上的多个ActivityIndicatorView,所以这是我的实现,以生成可重用代码,并且它不会像上面代码用于它所在的一个viewcontroller那样在控件上显示activityindicator视图。是的,对于使用它的每个控件,我都会单步执行此代码,并调用[activityIndicator startAnimating];对于传递到此函数的activityIndicator。我想问的是,我应该在代码的其他地方看什么

- (void)addActivityIndicatorView:(UIActivityIndicatorView *)acitivityIndicator toView:(UIView *)view {

    acitivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    acitivityIndicator.autoresizingMask = UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleRightMargin |
    UIViewAutoresizingFlexibleBottomMargin |
    UIViewAutoresizingFlexibleLeftMargin;                       
    CGRect aiFrame = acitivityIndicator.frame;
    CGFloat originX = (view.bounds.size.width - aiFrame.size.width) / 2;
    CGFloat originY = (view.bounds.size.height - aiFrame.size.height) / 2;
    aiFrame.origin.x = floorl(originX);
    aiFrame.origin.y = floorl(originY);
    acitivityIndicator.frame = aiFrame;
    [view addSubview:acitivityIndicator];
}

按照以下方式编写您的方法:

- (void)addActivityIndicatorView:(UIActivityIndicatorView **)activityIndicator toView:(UIView *)view {

    UIActivityIndicatorView * activeInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activeInd.autoresizingMask = UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleRightMargin |
    UIViewAutoresizingFlexibleBottomMargin |
    UIViewAutoresizingFlexibleLeftMargin;                       
    CGRect aiFrame = activeInd.frame;
    CGFloat originX = (view.bounds.size.width - aiFrame.size.width) / 2;
    CGFloat originY = (view.bounds.size.height - aiFrame.size.height) / 2;
    aiFrame.origin.x = floorl(originX);
    aiFrame.origin.y = floorl(originY);
    activeInd.frame = aiFrame;

    *activityIndicator = activeInd;
    [view addSubview:*activityIndicator];
}
如果要使用上述方法,请将对
UIActivityIndicatorView*
的引用传递给该方法,例如:

-(void) viewDidLoad
{
  [super viewDidLoad];

  UIActivityIndicatorView * ai;
  [self addActivityIndicatorView: &ai toView: self.view];

  activityIndicator = ai;
}
现在,无论何时开始设置动画:

[activityIndicator startAnimating];

在主线程中,开始设置动画和停止设置动画之间的时间非常少,以至于活动指示器不会显示。您可以通过分离到新线程进行检查,在新线程中,您将开始设置动画并停止设置动画。您知道,方法不会修改传递给它的实际参数,相反,它制作参数的副本,并在副本上执行方法内部的任何操作。如果我们想修改实际参数,我们通过引用传递它们(通过传递指向参数的指针)。在您的例子中,您希望修改一个指针,这就是为什么您应该将引用传递给指针(指向指针的指针)的Zeus。我在C#中就知道这一点,因为你不能新建一个传递到方法中的对象,或者实际上让它指向另一个对象,只能修改它的内容,调用它的方法,等等,我假设这在Obj-C中也是一样的。