我正在尝试创建波纹管属性包装器
@propertyWrapper
public struct ConstraintValue {
private let view:UIView
private let contraint:NSLayoutConstraint
public init(contraint:NSLayoutConstraint,view:UIView) {
self.contraint = contraint
self.view = view
}
public var wrappedValue: CGFloat {
set {
contraint.constant = newValue
view.layoutIfNeeded()
}
get {
return contraint.constant
}
}
}
但是当我尝试使用它时,我得到“无法在属性初始化程序中使用实例成员;属性初始化程序在'self'可用之前运行”
@IBOutlet weak private var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue(contraint: imageViewHeightConstraint, view: self)
public var imageHeight:CGFloat
有没有办法解决此错误?
答案 0 :(得分:0)
您不能使用<?php
namespace App\Http\Controllers\Havence;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Session;
use App\Mail\Automail;
use App\auto_mail_condition;
use App\modulename;
use App\AutoEmailTemplate;
use App\EmailSave;
use App\AppModule;
use app\resources\views\emails\Automailsend;
class AutoMailController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$mailTemplates =AutoEmailTemplate::all();
return view('havence.marketing.index',compact('mailTemplates'));
}
public function create(Request $request)
{
$request->validate([
'subject' => 'required',
'message' => 'required',
//'select'=>'required',
'days'=>'required'
]);
$data = [
'subject' => $this->replaceVariables($request->subject),
'message' => $this->replaceVariables($request->message),
//'select' => $this->replaceVariables($request->select),
'days' => $this->replaceVariables($request->days)
];
}
protected function getReplaceable()
{
return [
'{customer_name}' => Auth::user()->name ,
];
}
protected function replaceVariables($message)
{
$items = $this->getReplaceable();
foreach($items as $key => $value) {
$message = str_replace($key, $value, $message);
}
return $message;
}
public function store(Request $request)
{
// Store the data into the db
$data = $request->all();
$data['created_by'] = Auth::id();
return AutoEmailTemplate::create($data);
}
public function show($id)
{
//
}
public function edit(AutoEmailTemplate $mailTemplates , $id)
{
$mailTemplates=AutoEmailTemplate::find($id);
$conditions= auto_mail_condition::all();
$modules=AppModule::all();
return view('havence.marketing.edit', compact('mailTemplates','conditions','modules'));
}
public function update(Request $request, $id)
{
// $mailTemplates=AutoEmailTemplate::find($id);
// $input = $request->all();
// $mailTemplates->fill($input)->save();
// Session::flash('flash_message', 'Task successfully added!');
// return redirect()->back();
}
public function destroy($id)
{
$mailTemplates =AutoEmailTemplate::findOrFail($id);
$mailTemplates->delete();
return redirect('automail/index')->with(['message'=> 'Successfully deleted!!']);
}
public function mail()
{
$conditions= auto_mail_condition::all();
$modules=AppModule::all();
//$mailTemplates=AutoEmailTemplate::all();
return view(('havence.marketing.create'),compact('conditions','modules'));
}
}
和self
初始化此属性,因为此属性目前不存在。
最简单的解决方案是在视图的imageViewHeightConstraint
方法中将约束和视图传递给包装器,如下所示:
init()
或者,您可以将KeyPath用于@propertyWrapper
public struct ConstraintValue {
var view: UIView!
var constraint: NSLayoutConstraint!
public var wrappedValue: CGFloat {
set {
constraint.constant = newValue
view.layoutIfNeeded()
}
get {
return constraint.constant
}
}
}
class OurView: UIView {
var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue public var imageHeight:CGFloat
init() {
super.init(size: .zero)
_imageHeight.view = self
_imageHeight.constraint = imageViewHeightConstraint
}
}
,并将imageViewHeightConstraint
传递给视图的self
中的属性包装器。像这样:
init()