【问题标题】:How can I display an embedded view's toolbar?如何显示嵌入视图的工具栏?
【发布时间】:2013-11-07 21:21:57
【问题描述】:

我有一个嵌入在标准视图控制器中的表格视图。 tableview 有一个工具栏,我想显示它。

目前,工具栏仍未显示。

这个我试过了:

  • 将工具栏设置为显示在嵌入的表格视图中(代码+故事板)。
  • 将工具栏设置为在父视图控制器中显示(代码 + 故事板)。
  • 将工具栏设置为不在视图控制器中显示,而是在嵌入表格中显示(代码 + 故事板)。

如果我直接访问表格而不是通过嵌入视图访问,则工具栏存在(并正确显示)。嵌入视图的动作是否会移除工具栏?

如何在嵌入视图中显示 tableviews 工具栏?

编辑:新代码

ParentViewController.h

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import "childTable.h"

@interface ParentViewController : UIViewController <MFMailComposeViewControllerDelegate, UpdateParentProtocol>

@property (weak, nonatomic) IBOutlet UIBarButtonItem *emailButton;
@property (weak, nonatomic) NSString *buttonEnabled;
@property (weak, nonatomic) ChildTable *childTableVC;

@end

parentViewController.m

#import "ParentViewController.h"

@interface ParentViewController () <MFMailComposeViewControllerDelegate>

@end

@implementation ParentViewController

@synthesize emailButton;
@synthesize buttonEnabled;
@synthesize childTableVC;

 - (void)viewDidLoad
  {
        [super viewDidLoad];

 [self.childTableVC setDelegate:self];

}


-(void) isButtonEnabled:(NSString *)enabledX {

    NSLog(@"isButtonEnabled");

    enabledX = buttonEnabled;

if ([buttonEnabled isEqualToString:@"FALSE"])
{

    emailButton.enabled = FALSE;


}
else
{
    emailButton.enabled = TRUE;

}
}

childTable.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@protocol UpdateParentProtocol <NSObject>

@required
-(void) isButtonEnabled: (NSString *) enabledX;

@end

@interface childTable: UITableViewController {

    id <UpdateParentProtocol> delegate;

}

//@property (weak, nonatomic) IBOutlet UIBarButtonItem *emailButton;

@property (strong, nonatomic) NSString *enabledX;

@property (strong, nonatomic) id <UpdateParentProtocol> delegate;

childTable.m

 -(void) tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath {

NSLog(@"TableEditingEnded");

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

self.myArray = [defaults mutableArrayValueForKey:@"favourite_views_key"];

if (myArray == 0) {

    enabledX = @"FALSE";
    NSLog(@"PASSEDFALSE");

    [[self delegate] isButtonEnabled:enabledX];  }

else {

    enabledX = @"TRUE";
    NSLog(@"PASSEDTRUE");

    [[self delegate] isButtonEnabled:enabledX];  }

}

当我运行代码时,我从 TableEditingEnded 和 PASSEDTRUE 中得到一个 NSLog 打印,但没有 isButtonEnabled。这向我表明 -(void) isButtonEnabled:(NSString *)enabledX 没有被调用。你能建议为什么吗?

【问题讨论】:

    标签: ios ios7 toolbar


    【解决方案1】:

    这里是如何使用协议从子视图控制器到父视图控制器进行通信

    @protocol UpdateParentProtocol <NSObject>
    
    -(void)doSomething1;
    -(void)doSomething2;
    
    @end
    
    @interface ParentViewController : UIViewController<UpdateParentProtocol>
    
    @end
    
    @implementation ParentViewController
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        TableViewController *tableViewController = segue.destinationViewController;
        tableViewController.delegate = self;
    }
    
    -(void)doSomething1
    {
        NSLog(@"doSomething1");
    }
    
    -(void)doSomething2
    {
        NSLog(@"doSomething2");
    }
    
    @end
    ----
    
    #import "ParentViewController.h"
    
    @interface TableViewController : UITableViewController
    
    @property(strong, nonatomic) id<UpdateParentProtocol> delegate;
    
    @end
    
    @implementation TableViewController
    
    
    -(void)updateParentWithData
    {
        if( [self.delegate respondsToSelector:@selector(doSomething1)])
        {
            [self.delegate performSelector:@selector(doSomething1)];
        }
    }
    

    【讨论】:

    • 感谢 Jonah 的输入,但我很容易在我的表格视图上实现了一个工具栏。表格视图上的工具栏有一个与表格中的项目数量相关联的按钮,当数量达到零时,该按钮将变得不可用(以避免崩溃)。我最初确实尝试将工具栏放在父视图控制器中,但发现每次计数达到零时将数据从子级传递给父级非常复杂。也许如果您无法就在子视图中显示工具栏提供任何建议,您可以提供一些关于如何将数据从子视图传回父视图的信息?
    • 您可以通过多种不同的方式在视图控制器之间传递数据。 1)您可以在父视图控制器中创建工具栏,然后通过属性将引用传递给您的表视图控制器 2)您可以使用块 3)您可以使用委托。
    • 感谢您的评论;我当前的数据传输方法(用于转发数据)使用 1,但我使用 segues 来实际执行数据传输过程。由于在用户编辑子表时没有激活 segue(因此意味着按钮应该是灰色的),在这种情况下,您如何建议我将数据实际传递给父表?
    • 感谢您的输入,看来协议方法是我的最佳选择。我已经尝试使用您的说明(以及一些额外的阅读)来实现它,但我很困惑为什么它不调用我放在 parentviewcontroller 中的方法,你能看看代码吗我刚刚发了? (如果您愿意,我会将其移至一个新问题,并在您能帮助我的情况下将两者都标记为正确)。
    • 很高兴能帮上忙。您需要 prepareForSegue,因为没有其他方法可以获取对容器视图中嵌入内容的引用。处理它的另一种方法是使用视图控制器包含(本质上就是这样)。但是你必须做所有的工作来在代码中建立关​​系,而不是让 IB 为你做繁重的工作。
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2015-10-14
    • 2021-12-25
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多