【问题标题】:render dynamic form in iPhone application在 iPhone 应用程序中呈现动态表单
【发布时间】:2013-01-27 14:56:01
【问题描述】:

我必须使用 tableview 在 iPhone 应用程序中呈现动态表单。此表单可能有多个 UI 控件,如按钮、文本字段、标签、选择器、日期选择器。

我得到了一个 iPad 示例代码,它能够呈现动态表单,但 this 示例代码使用的是 UIPopoverController,它不受 iPhone 应用程序的支持。 所以我正在寻找一些可以在 iPhone 上运行的示例代码。

以下是在动态表单中单击按钮时显示组合框的代码。我需要显示带有列表项的选择器的代码。

示例代码:https://github.com/ecrichlow/iPad-Dynamic-Table-Cells

- (IBAction)buttonPressed:(id)sender
{

    [delegate rowItemWasSelected:self];
    if (self.itemControlType == ControlTypeToggleButton)
        {
        ...
        }
    else if (self.itemControlType == ControlTypePopup)
        {
        ...
        }
    else if (self.itemControlType == ControlTypeCombo)
        {
        UITableViewController *popoverTable = [[[UITableViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
        UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, DEFAULT_POPOVER_WIDTH, DEFAULT_TOOLBAR_HEIGHT)] autorelease];
        UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, DEFAULT_POPOVER_WIDTH, ([self.controlSelections count] * popoverTable.tableView.rowHeight) + DEFAULT_TOOLBAR_HEIGHT)] autorelease];
        UIViewController *containerViewController = [[[UIViewController alloc] init] autorelease];
        UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:containerViewController];
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(DEFAULT_COMBO_TEXTFIELD_MARGIN, (DEFAULT_TOOLBAR_HEIGHT - DEFAULT_COMBO_TEXTFIELD_HEIGHT) / 2, DEFAULT_POPOVER_WIDTH - (DEFAULT_COMBO_TEXTFIELD_MARGIN * 2), DEFAULT_COMBO_TEXTFIELD_HEIGHT)];
        textField.delegate = self;
        textField.autocorrectionType = UITextAutocorrectionTypeNo;
        textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
        textField.font = [UIFont systemFontOfSize:DEFAULT_COMBO_FONT_SIZE];
        textField.borderStyle = UITextBorderStyleRoundedRect;
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        [textField addTarget:self action:@selector(fieldTextDidUpdate:) forControlEvents:UIControlEventEditingDidEnd];
        containerViewController.view = containerView;
        popoverTable.tableView.dataSource = self;
        popoverTable.tableView.delegate = self;
        popoverTable.tableView.frame = CGRectMake(0, DEFAULT_TOOLBAR_HEIGHT, DEFAULT_POPOVER_WIDTH, [self.controlSelections count] * popoverTable.tableView.rowHeight);
        popoverController.popoverContentSize = CGSizeMake(DEFAULT_POPOVER_WIDTH, ([self.controlSelections count] * popoverTable.tableView.rowHeight) + DEFAULT_TOOLBAR_HEIGHT);
        popoverController.delegate = self;
        [toolbar addSubview:textField];
        [containerView addSubview:toolbar];
        [containerView addSubview:popoverTable.tableView];
        optionPopoverController = popoverController;
        [popoverController presentPopoverFromRect:control.frame inView:control.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        // If there's currently an object that's first responder, make it resign that status
        for (UIView *subview in self.control.superview.subviews)
            {
            if ([subview isKindOfClass:[UITextField class]])
                {
                if ([subview isFirstResponder])
                    {
                    [subview resignFirstResponder];
                    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
                    }
                }
            }
        [textField becomeFirstResponder];
        }
    else if (self.itemControlType == ControlTypeButton)
        {
        // Don't need to do anything here. Caller passed in target and action. But in order to trigger delegate rowItemWasSelected this control type was added here.
        }

}

【问题讨论】:

  • 你为什么不接受答案??如果你不接受,那么没有人会表现出有兴趣回答你的问题。

标签: iphone objective-c ios5 uipickerview dynamic-tables


【解决方案1】:

您可以修改示例代码 iPad-Dynamic-Table-Cells 以在 iPhone 中呈现动态表单以及弹出框显示

将 git-hub https://github.com/50pixels/FPPopover 上可用的以下 6 个项目文件添加到您的 iPad-Dynamic-Table-Cells 示例代码中

FPPopoverController.h/.m、FPPopoverView.h/m 和 FPTouchView.h/.m

现在修改 FPTouchView.m、EditableTableDataRowItem.h 和 EditableTableDataRowItem.m 如下

//In EditableTableDataRowItem.h
@interface EditableTableDataRowItem : UIViewController <UITableViewDataSource, UITableViewDelegate, UIPopoverControllerDelegate, UITextFieldDelegate,FPPopoverControllerDelegate>
{

    id<EditableTableDataRowItemDelegate> delegate;

    RowItemControlType          itemControlType;        // So named to denote that this does not correspond to a UIControl
    NSArray                     *controlSelections;     // List of items to display for popup control type
    NSString                    *listKey;               // If controlSelections array contains NSManagedObjects or NSDictionaries, the key to use to get a string to represent the item
    CGSize                      baseSize;               // Default size of the control, with width relative to other items on the row
    BOOL                        resizeable;             // Determines whether item can be resized based on row width
    UIControl                   *control;               // Standard control particular to the type of row item
    UIImage                     *normalImage;           // Used to customize the appearance of any button-based control type
    UIImage                     *selectedImage;         // Used to customize the appearance of any button-based control type

    CGSize                      originalBaseSize;
    int                         state;
    int                         selectedIndex;
    UIPopoverController         *optionPopoverController;
    FPPopoverController *popover;
    id<FPPopoverControllerDelegate> delegate1;
}
@property(assign) id<EditableTableDataRowItemDelegate> delegate;
@property(assign) id<FPPopoverControllerDelegate> delegate1;
@property(nonatomic, retain) FPPopoverController *popover;
        .
        .

//在EditableTableDataRowItem.m中

- (IBAction)buttonPressed:(id)sender
{
    [delegate rowItemWasSelected:self];
    if (self.itemControlType == ControlTypeToggleButton)
        {
        .
        .
        .

        }
    else if (self.itemControlType == ControlTypePopup)
        {
        UITableViewController *popoverTable = [[[UITableViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
        popoverTable.tableView.dataSource = self;
        popoverTable.tableView.delegate = self;
        popover = [[FPPopoverController alloc] initWithViewController:popoverTable];

        popover.tint = FPPopoverDefaultTint;

        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            popover.contentSize = CGSizeMake(300, 500);
        }
        else {
            popover.contentSize = CGSizeMake(200, 300);
        }
        popover.arrowDirection = FPPopoverArrowDirectionAny;
        [popover presentPopoverFromView:sender];
        }
        .
        .
        .

}

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

    [popover dismissPopoverAnimated:YES];
}

//在FPTouchView.m文件中 //需要处理这个方法

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{

    UIView *subview = [super hitTest:point withEvent:event];

    //To-Do
    //
    return subview;
}

【讨论】:

    【解决方案2】:

    git-hub Popover for iPhone 上提供的项目将帮助您在 iPhone 应用中实现弹出框。

    您唯一需要做的就是检查上述代码中的设备并执行相应的操作。

    将 6 个文件添加到您的项目中

    FPPopoverController.h/.m、FPPopoverView.h/m 和 FPTouchView.h/.m

    然后创建两个样本

    DemoPopOverTableController.h

    #import <UIKit/UIKit.h>
    #import "FPPopoverController.h"
    @interface DemoPopOverTableController : UITableViewController {
        FPPopoverController *popOverController;
        NSArray *subCat;
    }
    -(id)initWithStyle:(UITableViewStyle)style andSubCategory:(NSArray *)subCategories 
    -(void)setPopOver:(FPPopoverController*)popOver;
    @end
    

    DemoPopOverTableController.m

    #import "DemoPopOverTableController.h"
    #import "FPPopoverController.h"
    @interface DemoTableController ()
    @end
    
    @implementation DemoTableController
    
    -(id)initWithStyle:(UITableViewStyle)style andSubCategory:(NSArray *)subCategories 
    {
        self = [super init];
        if (self) {
            // Custom initialization
            subCat = [NSArray arrayWtihArray:subCategories] ;
        }
        return self;
    }
    -(void)setPopOver:(FPPopoverController *)popOver
    {
        popOverController=popOver;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    #pragma mark - Table view data source
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [subCat count];
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        if(cell == nil)
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        NSString *tempCat=[subCat objectAtIndex:indexPath.row];
        cell.textLabel.text =tempCat;
        return cell ;
    }
    #pragma mark - Table view delegate
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"selected Category: %@",[subCat objectAtIndex:indexPath.row]);
        [popOverController dismissPopoverAnimated:YES];
    }
    @end
    

    这不是完整的答案,但这是你可以在上面的代码中做的事情

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
    {
        //iPhone popover lines of code
    DemoPopOverTableController *controller = [[DemoPopOverTableController alloc] initWithStyle:UITableViewStylePlain andSubCategory:subCat];
        FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller];
        [controller setPopOver:popover];
        [controller release];
    
        popover.delegate = self;
        popover.tint = FPPopoverDefaultTint;
        popover.arrowDirection = FPPopoverArrowDirectionUp;
        popover.contentSize = CGSizeMake(200, 200);
        //sender is the UIButton view
        [popover presentPopoverFromView:sender];
        [popover release];
    }
    else
    {
        //the original line of code you have already in your code
    }
    

    您可以实现委托方法以在触摸表格视图时执行一些操作

    - (void)presentedNewPopoverController:(FPPopoverController *)newPopoverController
              shouldDismissVisiblePopover:(FPPopoverController*)visiblePopoverController
    {    
        [visiblePopoverController dismissPopoverAnimated:YES];
        [visiblePopoverController autorelease];
    }
    
    - (void)popoverControllerDidDismissPopover:(FPPopoverController *)popoverController
    {
        // do something of your choice
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2020-09-17
      • 2020-09-19
      相关资源
      最近更新 更多