Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 在整个UITableView(设置面板)中添加多个自定义子视图_Objective C_Uitableview_Uiview - Fatal编程技术网

Objective c 在整个UITableView(设置面板)中添加多个自定义子视图

Objective c 在整个UITableView(设置面板)中添加多个自定义子视图,objective-c,uitableview,uiview,Objective C,Uitableview,Uiview,我有一个滑出式UIView,用作设置面板。视图有一个容器,其中包含一个表视图控制器。表视图本身有大约6组表示各种选项的静态单元格。每个单元格中有几个UIButton,根据组的不同,它们具有不同的行为。我创建了一个单独的自定义UIView子类,用于处理每个组中按钮的绘制。当第一次加载这个面板时,我为每个组的按钮创建一个字典&为每个组的自定义视图创建一个字典字典(具有匹配的键路径) 问题是自定义视图似乎只在面板的顶部对齐。当我向下滚动到面板底部时,按钮视图没有对齐。就我的一生而言,我似乎无法理解这一

我有一个滑出式UIView,用作设置面板。视图有一个容器,其中包含一个表视图控制器。表视图本身有大约6组表示各种选项的静态单元格。每个单元格中有几个UIButton,根据组的不同,它们具有不同的行为。我创建了一个单独的自定义UIView子类,用于处理每个组中按钮的绘制。当第一次加载这个面板时,我为每个组的按钮创建一个字典&为每个组的自定义视图创建一个字典字典(具有匹配的键路径)

问题是自定义视图似乎只在面板的顶部对齐。当我向下滚动到面板底部时,按钮视图没有对齐。就我的一生而言,我似乎无法理解这一点。以下是面板的图片:

以下是在面板加载时(在“设置”面板“表视图”控制器类中),我用来初始化设置和布局自定义子视图的代码:

-(无效)初始化设置
{
self.buttonStates=nil;//包含面板中所有按钮状态的字典字典
self.buttonview=nil;//包含所有按钮视图的字典字典(与self.buttonStates的键路径相同)。
NSMutableDictionary*按钮状态=[[NSMutableDictionary alloc]init];
NSMutableDictionary*按钮视图=[[NSMutableDictionary alloc]init];
nsaray*btnGroupNames=[self BTNGroupName];//按钮组名称数组。
NSArray*btnArrays=[self-btnArrays];//包含所有按钮的数组数组。
对于(int i=0;i<[b光线计数];i++){
NSArray*outerArray=[btnArrays objectAtIndex:i];
NSString*outerKey=[btnGroupNames对象索引:i];
NSMutableDictionary*innerDicV=[[NSMutableDictionary alloc]init];
NSMutableDictionary*innerDicS=[[NSMutableDictionary alloc]init];
用于(UIButton*btn在外部阵列中){
NSString*innerKey=[btn.titleLabel.text stringByReplacingOccurrencesOfString:@”“with String:@”“];
ButtonSelectionView*bsv=[[ButtonSelectionView alloc]initWithFrame:btn.frame];
bsv.alpha=0.0;
bsv.不透明=否;
[[btn superview]添加子视图:bsv];
[[btn superview]将子视图带到前面:btn];
[innerDicV addEntriesFromDictionary:@{innerKey:bsv}];
[innerDicS addEntriesFromDictionary:@{innerKey:未选择}];
}
[按钮查看设置值:innerDicV forKey:outerKey];
[buttonStates setValue:innerDicS-forKey:outerKey];
}
self.buttonview=buttonview;
self.buttonStates=按钮状态;
self.previousButtonStates=nil;
self.settingsLoaded=是;
}

旁注:字典是惰性实例化的。此外,我还尝试从viewDidLoad、ViewDidDisplay和viewDidLayoutSubviews调用此函数,但没有效果。如果您有任何建议,我们将不胜感激,谢谢

好吧,我也想到了这个。因为我已经将插座连接到IB中的按钮,所以我意识到我总是有一个对UIButton的frame属性的活动引用。我只需要在初始化/动画时将自定义视图的帧重置为当前按钮帧。所以我修改了上面的代码,添加了第三个NSDictionary,它通过与其他两个字典相同的键路径引用每个按钮。然后,当我需要更改/显示自定义UIView时,我引用了该字典中的按钮作为帧值:

- (void)initializeSettings
    {
        self.buttonStates = nil; // A dictionary of dictionaries with all button states within the panel
        self.buttonViews = nil;  // A dictionary of dictionaries with all button views (same keyPaths as self.buttonStates).
        NSMutableDictionary *buttonStates = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttonViews = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttons = [[NSMutableDictionary alloc] init];
        NSArray *btnGroupNames = [self btnGroupNames];
        NSArray *btnArrays = [self btnArrays];
        for(int i = 0; i < [btnArrays count]; i++){
            NSArray *outerArray = [btnArrays objectAtIndex: i];
            NSString *outerKey = [btnGroupNames objectAtIndex: i];
            NSMutableDictionary *innerDicV = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicS = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicB = [[NSMutableDictionary alloc] init];
            for(UIButton *btn in outerArray){
                NSString *innerKey = [btn.titleLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""];
                ButtonSelectionView *bsv  = [[ButtonSelectionView alloc] initWithFrame: btn.frame];
                bsv.alpha = 0.0;
                bsv.opaque = NO;
                [[btn superview] addSubview: bsv];
                [[btn superview] bringSubviewToFront: btn];
                [innerDicV addEntriesFromDictionary: @{ innerKey : bsv }];
                [innerDicS addEntriesFromDictionary: @{ innerKey : NOT_SELECTED }];
                [innerDicB addEntriesFromDictionary: @{ innerKey : btn }];
            }
            [buttonViews setValue: innerDicV forKey: outerKey];
            [buttonStates setValue: innerDicS forKey: outerKey];
            [buttons setValue: innerDicB forKey: outerKey];
        }
        self.buttonViews = buttonViews;
        self.buttonStates = buttonStates;
        self.buttons = buttons;
        self.previousButtonStates = nil;
        self.settingsLoaded = YES;
    }

希望这将有助于解决类似问题。我想象你可以通过编程的方式做同样的事情,在ViewDidLayoutSubView中初始化/存储按钮对象和自定义视图对象,并在更新UI时以相同的方式引用它们。

好的,也许简单地问一个问题:UIButtons在什么时候知道它们的框架在UITableViewCell中?在IB中定位所有UIButton时,如何获取所有UIButton(甚至是可见视图之外的)的所有帧?通过列举门店系列,我似乎得到了与上图相同的结果。
- (void)initializeSettings
    {
        self.buttonStates = nil; // A dictionary of dictionaries with all button states within the panel
        self.buttonViews = nil;  // A dictionary of dictionaries with all button views (same keyPaths as self.buttonStates).
        NSMutableDictionary *buttonStates = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttonViews = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttons = [[NSMutableDictionary alloc] init];
        NSArray *btnGroupNames = [self btnGroupNames];
        NSArray *btnArrays = [self btnArrays];
        for(int i = 0; i < [btnArrays count]; i++){
            NSArray *outerArray = [btnArrays objectAtIndex: i];
            NSString *outerKey = [btnGroupNames objectAtIndex: i];
            NSMutableDictionary *innerDicV = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicS = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicB = [[NSMutableDictionary alloc] init];
            for(UIButton *btn in outerArray){
                NSString *innerKey = [btn.titleLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""];
                ButtonSelectionView *bsv  = [[ButtonSelectionView alloc] initWithFrame: btn.frame];
                bsv.alpha = 0.0;
                bsv.opaque = NO;
                [[btn superview] addSubview: bsv];
                [[btn superview] bringSubviewToFront: btn];
                [innerDicV addEntriesFromDictionary: @{ innerKey : bsv }];
                [innerDicS addEntriesFromDictionary: @{ innerKey : NOT_SELECTED }];
                [innerDicB addEntriesFromDictionary: @{ innerKey : btn }];
            }
            [buttonViews setValue: innerDicV forKey: outerKey];
            [buttonStates setValue: innerDicS forKey: outerKey];
            [buttons setValue: innerDicB forKey: outerKey];
        }
        self.buttonViews = buttonViews;
        self.buttonStates = buttonStates;
        self.buttons = buttons;
        self.previousButtonStates = nil;
        self.settingsLoaded = YES;
    }
bsv.frame = ((UIButton *)[self.buttons valueForKeyPath: keyPath]).frame;