Ios 字符串数组作为UIPickerView的数据源

Ios 字符串数组作为UIPickerView的数据源,ios,swift,uipickerview,Ios,Swift,Uipickerview,我在用字符串数组填充UIPickerView时遇到问题,每行都是一个选择。我正在ViewController类中创建UIPicker出口,并在从main.async调用生成数据时更改UIPicker // Creating our UIView Controller WeldFloorController // WeldFloorController provides functionality to the WeldFloor screen class WeldFloorController

我在用字符串数组填充UIPickerView时遇到问题,每行都是一个选择。我正在ViewController类中创建UIPicker出口,并在从main.async调用生成数据时更改UIPicker

// Creating our UIView Controller WeldFloorController
// WeldFloorController provides functionality to the WeldFloor screen

class WeldFloorController: UIViewController{

    // Defining the regex String to be used
    let regexString = String( """
((?:<div id=\\d{1,3}>)(UID:\\d{1,3})(currentPartNumber:(.{0,20}))(workcenter:(.{0,20}))(cycleTime:(.{0,20}))(curPartCycleTime:(.{0,20}))(partsMade:(.{0,20}))(CycleTimeActual:(.{0,20}))(target:(.{0,20}))(actual:(.{0,20}))(downtime:(.{0,20}))(statusReason:(.{0,30}))(lineStatus:(.{0,50}))(efficiency:(.{0,20}))(plusminus:(.{0,20}))(curProdTime:(.{0,30}))(<\\/div>))
""");

    // Defining Main Thread for Data updates
    let main = DispatchQueue.main;

    // Intializing all usable objects on screen
    @IBOutlet weak var weldFloorProductionPicker: UIPickerView!;
    @IBOutlet weak var weldFloorDataDisplay: UICollectionView!;

    // Configuring objects on screen happens within viewDidLoad()
    // P*S Since the exectution is happening asynchronous so
    // all updates must be made from within WorkcenterStatus.sharedInstance.run { }
    override func viewDidLoad() {

        // INITIAL CONFIGURATION OF OBJECTS (SUCH AS defaultText etc..) DONE HERE


        // END CONFIG

        // Starting WebService
        WorkcenterStatus.sharedInstance.run { result in
            switch result {

            // If Successful then execute main.async
            // In other words execute everything in .success
            // when webService == Successful
            // [execute main.async] { code here }

            case .success(let htmlBody): self.main.async {
                // First operation -- Return all matches into an array of Strings
                let returnHtml = matches(for: self.regexString, in: htmlBody);

                // Second operation -- For each match return an integer
                let dataPoints = returnHtml.count;

                // Third operation -- Populate our UICollections with our data                   
                // Sub Operation #1 -- Creating the dataSource
                // Edit** I kept this here for one thing ^^ DataSources should be called
                // from a seperate class file or library -- Using dataSources built within
                // the viewController are not reusable unless the dataSource is delegated
                // to another ViewController which at the point it would be just better
                // to create another lib file
                // and call that from there

                // Sub Operation #1 Actual -- Setting a dataSource object


                self.weldFloorProductionPicker.dataSource = returnHtml[];

                };

            // If failed then print error
            case .failure(let error): print(error)
            };
        };
        // Additional Setup
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    };
};
//创建我们的UIView控制器WeldFloorController
//WeldFloor控制器为WeldFloor屏幕提供功能
类WeldFloorController:UIViewController{
//定义要使用的正则表达式字符串
让regexString=String(“”)
(10:(((?::)((((((?::)以下以下:({0,20 0 0 0,20})工作中心:({00,20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0:)(货币::{1,3 3.3 0 0 0.3{{1,3 0 0 0 0 0 0 0 0 0 0 0 0})以下以下以下以下以下:))((((((((((((((((:::::::::::::{0.0,0 0.0.0 0 0 0 0.0,20::::))))))))))))))))))))))))(货币:::)))(教学教学:(((((({{{{{{{{{{{0.0.0,1.0,1.0,1.0,3 0 0(plusminus:(.{0,20}))(curProdTime:(.{0,30})))
""");
//定义数据更新的主线程
让main=DispatchQueue.main;
//初始化屏幕上的所有可用对象
@IBOutlet弱var weldFloorProductionPicker:UIPickerView!;
@IBOutlet弱var weldFloorDataDisplay:UICollectionView!;
//在屏幕上配置对象发生在viewDidLoad()中
//因为执行是异步的,所以
//所有更新都必须从WorkcenterStatus.sharedInstance.run{}中进行
重写func viewDidLoad(){
//对象的初始配置(如defaultText等)在此处完成
//结束配置
//启动Web服务
WorkcenterStatus.sharedInstance.run{结果为
切换结果{
//如果成功,则执行main.async
//换句话说,在成功中执行一切
//当webService==成功时
//[执行main.async]{code here}
case.success(让htmlBody):self.main.async{
//第一个操作——将所有匹配项返回到字符串数组中
让returnHtml=matches(对于:self.regexString,在:htmlBody中);
//第二个操作——为每个匹配返回一个整数
让dataPoints=returnHtml.count;
//第三个操作——用数据填充UICollections
//子操作#1——创建数据源
//编辑**我把这个放在这里是为了一件事^^应该调用数据源
//从一个单独的类文件或库--使用内部构建的数据源
//除非委派数据源,否则viewController不可重用
//到另一个ViewController,此时它会更好
//创建另一个lib文件
//从那里打电话给我
//子操作#1实际-设置数据源对象
self.weldFloorProductionPicker.dataSource=returnHtml[];
};
//如果失败,则打印错误
案例失败(let错误):打印(错误)
};
};
//附加设置
super.viewDidLoad()
//加载视图后执行任何其他设置。
};
};
self.weldFloorProductionPicker.dataSource=returnHtml[]
这不是一种有效的方法来确定我想要将数据源设置为数组及其所有值吗?数组是一维的,我得到的错误是
无法用“()”类型的索引为“[String]”类型的值下标。
如果您有任何帮助,我们将不胜感激

谢谢,

你可以试试

class ViewController: UIViewController , UIPickerViewDelegate,UIPickerViewDataSource {

   var arr = [String]()

  override func viewDidLoad() {   
    super.viewDidLoad()

    self.weldFloorProductionPicker.delegate = self
    self.weldFloorProductionPicker.dataSource = self 

    WorkcenterStatus.sharedInstance.run { result in

        switch result { 
          case .success(let htmlBody):  
            let returnHtml = matches(for: self.regexString, in: htmlBody)
               self.arr = returnHtml 
                DispatchQueue.main.async {
                  self.weldFloorProductionPicker.reloadAllComponents()
                }
            }

        // If failed then print error
        case .failure(let error): 
              print(error)
        }
    }
  }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return arr.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return arr[row]
    }

} 

只需删除
[]
。这是斯威夫特:没有尾随的分号!嘿@vadian谢谢你的回复!我知道我在我的另一个问题上见过你——我能说什么,习惯是难以改变的!无论如何,我按照你的建议做了,现在我返回一个
无法将类型“[String]”的值赋给类型“UIPickerViewDataSource?”
任何想法??基本上你的方法是错误的。按照Sh_Khan的建议。你能解释一下你在做什么吗??您改变了类结构-在执行以下操作时是否扩展了ViewController类:UIViewController、UIPickerViewDeleteGate、UIPickerViewDataSource{