如何将选定的图像设置为多个UIImageViews

时间:2017-03-20 20:31:01

标签: ios uiimageview viewcontroller

嘿伙计们,所以我正在创建一个iOS应用程序,我成功地从相机或照片中拍摄应用程序中的照片,并将其存储在我的数据库中并检索它。

我的故事板上有大约30个不同的屏幕(viewcotrollers),最终会在成功登录后显示用户个人资料图片。我想知道如何将所选/特定图像设置为每个UIImageViews我需要为每个视图控制器添加相同的代码或者是什么。

很抱歉,如果问题有点模糊,我只是想显示一个与数据库中特定用户条目相对应的图像,并将其显示在每个屏幕/ Viewcontroller的UIImageView上。

任何帮助将不胜感激,

史蒂芬

3 个答案:

答案 0 :(得分:0)

如果我理解你的问题......是的,你需要在每个视图控制器上执行相同的代码,如果你想让它们全部显示特定的图像。但为了减少代码数量,您可以创建一个扩展名(单独的swift文件):

extension UIImageView {
   func setChosenImage {
      let image = // get your image from database
      self.image = image
   }
}

如果它没有帮助那么我可能没有得到你的问题,对不起:)

此外,可能有更好的解决方案,但我们需要了解更多。为什么需要在30个ViewControllers上显示相同的图像?也许你可以创建1个View Controller,然后从中创建子类。

答案 1 :(得分:0)

我会将UIImageView子类化为像UIPortraitImageView这样的东西,然后将自己设置为可以找到它的图像,也许是静态的:

class UIPortraitImageView : UIImageView {
    static var thePortraitImage = UIImage()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(image img:UIImage?) {
        super.init(image:img)
    }

    convenience init() {
        self.init(image:UIPortraitImageView.thePortraitImage)
    }
}

// Initialize it somewhere:
UIPortraitImageView.thePortraitImage = UIImage(named:"D70_4966.JPG")!

// Use it anywhere
var p = UIPortraitImageView()

您还可以通过指定自定义类在storyboards / .xib-Files中使用UIPortraitView,如下所示:

enter image description here

答案 2 :(得分:0)

如果您的目标是不必在视图控制器中使用自定义代码,则可以使用@AndreasOetjen在其答案中描述的方法:创建UIImageView的自定义子类。

然而,我会写它来查看内存中的图像,而不是让自定义图像视图查找静态文件。一种方法是设置一个包含可选UIImage的单例数据容器类:

static userImageLoadedNotice: String = "userImageLoaded"

public class DataSingleton {
  static let sharedDataSingleton = DataSingleton()

  public var userImage: UIImage? {
    didSet{
      NotificationCenter.post(name: userImageLoadedNotice, object: nil)
    }
}

上述课程将在加载/更改用户图像时广播通知。

然后设置图像视图以尝试在初始化时加载用户图像,并在图像更改时注册通知:

UIPortraitImageView : UIImageView {
  static var thePortraitImage = UIImage()

  var observer: Any?

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    observer = NotificationCenter.addObserver(forName: userImageLoadedNotice, 
      obj: nil, queue: nil) {
        self.image = DataSingleton.sharedDataSingleton.userImage
    }
    self.image = DataSingleton.sharedDataSingleton.userImage

  }

  override init(image img:UIImage?) {
    super.init(image:img)
    observer = NotificationCenter.addObserver(forName: userImageLoadedNotice, 
      obj: nil, queue: nil) {
        self.image = DataSingleton.sharedDataSingleton.userImage
    }
    self.image = DataSingleton.sharedDataSingleton.userImage
  }
  deinit {
    NotificationCenter.removeObjserver(observer)
  }
}

我在SO编辑器中删除了上面的代码。它并不完美,需要在编译之前进行清理。它并不意味着准备好复制粘贴。