0

テーブルビューを使用してiPhoneアプリケーションで動的フォームをレンダリングする必要があります。このフォームには、ボタン、テキストフィールド、ラベル、ピッカー、日付ピッカーなどの複数のUIコントロールが含まれる場合があります。

動的フォームをレンダリングできるiPad用のサンプルコードを1つ入手しましたが、このサンプルコードは、iPhoneアプリケーションでサポートされていないUIPopoverControllerを使用しています。だから私は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.
        }

}
4

2 に答える 2

1

git-hub Popover for iPhoneで利用可能なプロジェクトは、iPhoneアプリにポップオーバーを実装するのに役立ちます。

あなたがする必要がある唯一のことはあなたの上記のコードでデバイスをチェックし、それに応じてアクションを実行することです。

プロジェクトに6つのファイルを追加します

FPPopoverController.h / .m、FPPopoverView.h / m、およびFPTouchView.h / .m

次に、2つのサンプルを作成します

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
}
于 2013-01-24T07:35:47.620 に答える
1

サンプルコードiPad-Dynamic-Table-Cellsを変更して、ポップオーバー表示とともにiPhoneで動的フォームをレンダリングすることもできます

git-hubhttps://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;
}
于 2013-01-27T06:56:01.360 に答える