2

我正在使用 Parse iOS SDK,我想存储我的 findObjectsInBackgroundWithBlock : query in aUILabel . TheUILabel is created inside of theviewForHeaderInSection`:我的表视图的方法。

如果我创建UILabel块的内部,我可以成功存储我需要的值并在我的视图上显示标签。当查询在 Parse 中运行时,它会在查询使用本地缓存之前尝试连接到服务器 3 次。如果任何尝试失败或与服务器的连接速度很慢,我会UILabel闪烁。我不希望这样,所以我的想法是以某种方式在块之外访问我的查询结果并将其存储为UILabel块完成后。

有人可以告诉我如何在块外访问我的查询结果并将结果存储在 a 中UILabel吗?

下面的示例是我当前如何UILabel在视图上创建 并将我的块的结果显示为UILabel. 谢谢您的帮助!

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
        {
                UIView *myHeader = [[UIView alloc] initWithFrame:CGRectMake(0,60,320,20)];
                myHeader.backgroundColor = [UIColor grayColor];

                PFQuery *query = [PFQuery queryWithClassName:@"ClassName"];
                query.cachePolicy = kPFCachePolicyNetworkElseCache;
                [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

                if (!error) 
                {
                    NSNumber *sum = [objects valueForKeyPath:@"@sum.sumResults"];
                    UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(15,0,120,20)] ;
                    myLabel1.font = [UIFont boldSystemFontOfSize:14.0];
                    myLabel1.text = [NSString stringWithFormat:@"Sum results: %.1f", [sum floatValue]];
                    [myHeader addSubview:myLabel1];

                } 
                else 
                {
                     NSLog(@"Error: %@ %@", error, [error userInfo]);
                }

        }];

        return myHeader;
    }
4

2 回答 2

0

问题的很大一部分是您在“ findObjectsInBackgroundWithBlock”结果(完成)块中创建标签。因此,除了该代码块之外,您的应用程序中的任何其他地方都不容易使用它。

我建议您将 UILabel 作为 IBOutlet(即,将其放入情节提要或 xib 文件中,并将其连接到视图控制器中的插座)。

然后,当您获得要显示的结果时,向您自己(或任何观察者)发布通知,通知您该更新了(我建议 postNotificationName:object:userInfo:userInfo 字典在哪里包含您要添加到该标签的任何信息)。

于 2015-01-05T02:45:35.383 回答
0

您正在一个块中创建标签,使其对您的其余代码不可用。为了从块外部访问标签,请在 .m 文件中创建一个属性:

@interface YourViewController()
//here comes your label
@property (strong, nonatomic) UILabel *myLabel1;
@end

然后在你的@implementation 之后合成它:

@implementation YourViewController
@synthesize myLabel1;

现在,而不是打电话

UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(15,0,120,20)];

只需调用

myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(15,0,120,20)];

然后,您可以从代码中的任何地方访问您的标签(但请确保您在尝试访问它时已经启动它!在您的情况下,当您坚持在您的viewForHeaderInSection方法中启动它时,请确保仅在此方法已被调用并且标签已有效启动。

于 2015-06-25T21:33:38.377 回答