我需要创建一个包含多个UILabel
或UIbutton
(约20个)的视图控制器,它会打开一个输入UITextField
的警告框。这样做的最佳方法是什么?
另外,如果在UIScrollView
中添加它们是合适的,因为我不能将所有20个放在故事板视图中,如何将它们连接到每个视图?
答案 0 :(得分:5)
您应该使用表格视图。如果您只有20个这样的项目,那么您可以使用静态表格视图单元格在故事板中创建它们。
答案 1 :(得分:1)
如果您知道某些内容会重复某些n times
,那么将它们添加到视图中的最佳方法是使用UITableView(用于垂直视图)或UICollectionView(用于类似网格的视图),但是,如果项目不同且不重复,则显示它们的最佳情况是使用UIScrollView。你添加一个带有scrollView的UIView作为它的孩子。
之后,您可以在UIScrollView中添加更多子视图,并在更多项目开始添加时立即增加Scrollview的尺寸。要增加ScrollView高度或说宽度,或两者都增加,请将contentSize
与viewWillLayoutSubviews()
一起使用。结构可能如下所示:
View
--UIScrollView
---UILabel1
---UIImageView
---UITextView
---UIButton
要创建布局,有以下几种方法:
1.您可以在simulated size
下将size inspector
设置为Freeform
,并选择高度和宽度,然后添加子视图,例如UITextView,UILabel等。
2.以编程方式添加UIScrollView,然后将其他视图添加为滚动的子视图。
希望它有助于使您成为正确的选择。
感谢。
答案 2 :(得分:1)
由于Pradeep非常简单地为您提供解决方案,我尝试了,我得到了它。我在下面发布了答案。它工作正常。
目标C
ViewController.m
#import "ViewController.h"
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
NSMutableArray *array;
}
@property (strong, nonatomic) IBOutlet UITableView *tableViewData;
@end
@implementation ViewController
@synthesize tableViewData;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
array = [[NSMutableArray alloc]initWithObjects:@"iOS",@"Android",@"Windows",@"Blackberry",@"iPad",@"iPod",@"iWatch",@"iTV",@"iPhone",@"Tablet",@"Lenova",@"Microsoft",@"Honor",@"Samsung",@"Mi4",@"Moto",@"Lava",@"Nokia",@"ASus",@"OnePlus", nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//UITableView DataSource methods
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return array.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *strCell = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:strCell];
if(cell==nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCell];
}
cell.textLabel.text = array[indexPath.row];
return cell;
}
//UITableView Delegates Methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Input" message:@"TextField" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
{
textField.placeholder = NSLocalizedString(@"Enter the Product Name", @"Login");
textField.text = array[indexPath.row];
}];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField)
{
textField.placeholder = NSLocalizedString(@"Enter the Password", @"Password");
textField.secureTextEntry = YES;
}];
UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:ok];
[self presentViewController:alertController animated:YES completion:nil];
}
@end
SWIFT
import UIKit
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet var tableViewData: UITableView!
var array : [String] = ["iOS","Android","Windows","Blackberry","iPad","iPod","iWatch","iTV","iPhone","Tablet","Lenova","Microsoft","Honor","Samsung","Mi4","Moto","Lava","Nokia","ASus","OnePlus"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as UITableViewCell?
if (cell == nil) {
cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL")
}
cell?.textLabel?.text = array[indexPath.row] as String
return cell!
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
let alertController = UIAlertController(title: "Input", message: "TextField", preferredStyle: .Alert)
var loginTextField: UITextField?
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
// Enter the textfiled customization code here.
loginTextField = textField
loginTextField?.placeholder = "Enter the product"
loginTextField?.text = self.array[indexPath.row]
}
let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(defaultAction)
presentViewController(alertController, animated: true, completion: nil)
}
}
答案 3 :(得分:0)
有三种一般方法。
<强>滚动型强>
请参阅Fennec的答案。
<强>的TableView 强>
TableView有两种方法:Static
和Dynamic
。
如果您始终确定有20个按钮/标签,则可以使用静态TableView,并且您不会面对您在IB中提到的有关scrollView的问题(因为tableViews在IB中可滚动)。但如果你不确定总有20个按钮/标签,那么使用Dynamic tableViews会更好。 user3182143的答案涵盖了这一点。
<强> StackView 强>
参见本教程 - &gt; Introducing Stack Views
但如果是我,我会使用Dynamic TableView。